2010-10-03 23 views
6

Trong Perl tôi bắt đầu một quá trình bằng lệnh nohup. Lệnh dưới đây:Làm cách nào để ngăn chặn đầu ra của hệ thống khi sử dụng nohup từ Perl?

system("nohup myproc pe88 &"); 

Điều này làm việc tốt và quá trình bắt đầu như mong đợi. Tuy nhiên tôi muốn ngăn chặn đầu ra sau đây của lệnh này - đó là:

Sending output to nohup.out 

tôi phải có quá trình này chuyển hướng tất cả của nó là đầu ra để nohup.out nhưng tôi chỉ không muốn nó hiển thị khi tôi chạy của tôi Chương trình Perl. Thay vào đó, tôi muốn in thông điệp thân thiện với người dùng của riêng mình. Tôi đã thử một vài biến thể nhưng không có gì làm việc cho tôi.

Trả lời

4

"Sending output to nohup.out" nhắn is sent to STDERR, vì vậy bạn có thể bắt các thiết bị lỗi chuẩn thông qua các phương pháp thông thường

  • hoặc thông qua shell: system("nohup myproc pe88 2> /tmp/error_log.txt &");

    Sử dụng /dev/null thay vì /tmp/error_log.txt nếu bạn không cần stderr ở tất cả; và thêm "> /tmp/myout.txt" để chuyển hướng stdout.

  • Hoặc bằng cách bắt qua Perl (không sử dụng system() cuộc gọi, thay vì sử dụng IPC::Open3 hoặc capture command from IPC::System::Simple)

+2

Lưu ý rằng chỉ bằng cách bắt STDERR, nohup thậm chí không in thông báo "gửi đầu ra đến nohup.out". –

5

Làm thế nào về:

system("nohup myproc pe88 >nohup.out 2>&1 &"); 

Các trang người đàn ông cho nohup nói:

Nếu đầu ra tiêu chuẩn là đầu cuối, ap đổi đầu ra thành 'nohup.out' nếu có thể, '$ HOME/nohup.out' nếu không. Nếu lỗi chuẩn là đầu cuối, hãy chuyển hướng đến đầu ra tiêu chuẩn. Để lưu đầu ra thành TẬP_TIN, hãy sử dụng 'nohup COMMAND> FILE'.

Vì vậy, nếu bạn chuyển hướng rõ ràng STDOUT và STDERR đến nohup.out, thì nohup sẽ không in thông báo đó. Cấp, bạn không nhận được dự phòng tự động thành $ HOME/nohup.out nếu nohup.out là không thể đọc được, nhưng bạn có thể kiểm tra điều đó trước nếu đó là vấn đề.

Lưu ý rằng nếu bạn chuyển hướng chỉ STDOUT, nohup sẽ in thông báo "chuyển hướng stderr thành stdout".

Các vấn đề liên quan