Ví dụ, khi tôi gõ ping 8.8.8.8 &, tại sao chúng ta có thể thấy quá trình ping hoạt động? Và khi tôi gõ find / -name '*test*' &, nó cũng được nhìn thấy trên màn hình.
Tại sao vậy? Nó không thực sự trong nền?
Ví dụ, khi tôi gõ ping 8.8.8.8 &, tại sao chúng ta có thể thấy quá trình ping hoạt động? Và khi tôi gõ find / -name '*test*' &, nó cũng được nhìn thấy trên màn hình.
Tại sao vậy? Nó không thực sự trong nền?
Câu trả lời:
Các &shell chỉ đạo để chạy lệnh trong nền, nghĩa là, nó được rẽ nhánh và chạy trong một shell phụ riêng biệt, như một công việc, không đồng bộ.
Lưu ý rằng khi bạn đặt &đầu ra - cả thiết bị xuất chuẩn và thiết bị xuất chuẩn - vẫn sẽ được in trên màn hình . Nếu bạn không muốn thấy bất kỳ đầu ra nào trên màn hình, hãy chuyển hướng cả hai stdoutvà stderrđến một tệp bằng cách:
myscript > ~/myscript.log 2>&1 &
Thông thường bạn có thể muốn loại bỏ stderrbằng cách chuyển hướng nó đến /dev/nullnếu bạn không lo lắng về việc phân tích lỗi sau này.
Bạn thậm chí có thể chạy các lệnh / script cùng một lúc, trong các shell con riêng biệt. Ví dụ;
./script1 & ./script2 & ./script3 &
Một công việc nền có thể được đưa trở lại dòng lệnh trước khi nó kết thúc bằng lệnh:
fg <job-number>
Có job-numberthể có được bằng cách chạy
jobs
2>&1chuyển hướng stderrđến stdout.
stty tostopsẽ khiến các công việc nền bị đình chỉ nếu họ cố gắng ghi vào thiết bị đầu cuối.
Khi bạn sử dụng &, quá trình đang chạy trong nền. Nhưng đầu ra tiêu chuẩn của nó vẫn là thiết bị đầu cuối.
Trong thực tế, bạn có thể chạy ping 8.8.8.8 &và find / -name '*test*' &cùng một lúc (dẫn đến đầu ra hỗn hợp), nhưng bạn không thể chạy ping 8.8.8.8và find / -name '*test*'cùng một lúc trên cùng một vỏ.
Nếu bạn không muốn thấy bất cứ điều gì, hãy sử dụng một cái gì đó như ping 8.8.8.8 &> /dev/null &.
Ngoài ra, bạn có thể muốn tìm hiểu về nohupvà disown.
disownkhông ngăn chặn đầu ra được in đến thiết bị đầu cuối.
/dev/nullnhư một tệp để chuyển hướng đầu ra của thiết bị đầu cuối nếu muốn loại bỏ đầu ra thay vì lưu nó ở đâu đó. Và tôi có đúng là2>&1chuyển hướngstderrđếnstdout? Có lẽ bạn cũng muốn làm rõ điều đó ... Cảm ơn.