Tại sao tôi có thể thấy đầu ra của các quá trình nền?


31

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:


43

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 stdoutstderrđế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>

job-numberthể có được bằng cách chạy

jobs

Câu trả lời tốt. Bạn có thể bao gồm rằng người ta cũng có thể sử dụng /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ướng stderrđến stdout? Có lẽ bạn cũng muốn làm rõ điều đó ... Cảm ơn.
Chỉ huy Byte

@ByteCommander Cảm ơn :) đã chỉnh sửa, hy vọng nó đã rõ ràng. Vâng, bạn đã đúng, 2>&1chuyển hướng stderrđến stdout.
Ron

3
Tôi nghĩ rằng sẽ đáng để đề cập đến việc 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.
kasperd

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

Nhược điểm duy nhất của việc đó là thứ tự của các đầu ra cho thiết bị xuất chuẩn và thiết bị xuất chuẩn có thể bị lẫn lộn trong tệp nhật ký.
matthieu

8

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 &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.8find / -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ề nohupdisown.


disownkhông ngăn chặn đầu ra được in đến thiết bị đầu cuối.
Ruslan

@Ruslan: không, nhưng nó loại bỏ công việc khỏi vỏ. Điều này có thể (hoặc có thể không) là điều mà OP có thể quan tâm.
Andrea Corbellini
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.