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 stdout
và 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ỏ stderr
bằng cách chuyển hướng nó đến /dev/null
nế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-number
thể có được bằng cách chạy
jobs
2>&1
chuyển hướng stderr
đến stdout
.
stty tostop
sẽ 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.8
và 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ề nohup
và disown
.
disown
không ngăn chặn đầu ra được in đến thiết bị đầu cuối.
/dev/null
như 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>&1
chuyển hướngstderr
đếnstdout
? Có lẽ bạn cũng muốn làm rõ điều đó ... Cảm ơn.