从Perl使用nohup时如何抑制系统输出?

san*_*eep 6 perl

在Perl中,我使用nohup命令启动进程.命令如下:

system("nohup myproc pe88 &");
Run Code Online (Sandbox Code Playgroud)

这工作正常,过程按预期开始.但是,我想抑制此命令的以下输出 - 这是:

Sending output to nohup.out
Run Code Online (Sandbox Code Playgroud)

我必须让这个过程将它的所有输出重定向到nohup.out,但我只是不想在运行我的Perl程序时显示它.我想改为打印我自己的用户友好消息.我尝试过一些变种,但对我来说没有任何效果.

DVK*_*DVK 5

"Sending output to nohup.out"消息发送到 STDERR,因此您可以通过常用方法捕获 STDERR

  • 要么通过外壳: system("nohup myproc pe88 2> /tmp/error_log.txt &");

    如果您根本不需要 stderr 则使用/dev/null代替/tmp/error_log.txt;并添加“ > /tmp/myout.txt”以重定向标准输出。

  • 或者通过 Perl 捕获(不要使用system()调用,而是使用IPC::System::Simple 中的IPC::Open3capture命令

  • 请注意,仅仅通过捕获 STDERR,nohup 甚至不会打印“将输出发送到 nohup.out”消息。 (2认同)

Mic*_*ebs 5

怎么样:

system("nohup myproc pe88 >nohup.out 2>&1 &");
Run Code Online (Sandbox Code Playgroud)

nohup的手册页说:

如果标准输出是终端,则在可能的情况下将输出附加到'nohup.out',否则为'$ HOME/nohup.out'.如果标准错误是终端,则将其重定向到标准输出.要将输出保存到FILE,请使用`nohup COMMAND> FILE'.

因此,如果您明确地将STDOUT和STDERR重定向到nohup.out,那么nohup不会打印该消息.当然,如果nohup.out不可写,则不会自动回退到$ HOME/nohup.out,但如果这是一个问题,您可以先检查它.

请注意,如果仅重定向STDOUT,nohup会打印"将stderr重定向到stdout"消息.