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

Posted

技术标签:

【中文标题】在 Perl 中使用 nohup 时如何抑制系统输出?【英文标题】:How can I suppress system output when using nohup from Perl? 【发布时间】:2010-10-03 00:19:18 【问题描述】:

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

system("nohup myproc pe88 &");

这工作正常,进程按预期开始。但是,我想禁止此命令的以下输出 - 即:

Sending output to nohup.out

我必须让这个进程将它的所有输出重定向到 nohup.out,但我只是不想在我运行我的 Perl 程序时显示它。相反,我想打印我自己的用户友好消息。我已经尝试了一些变体,但没有一个对我有用。

【问题讨论】:

【参考方案1】:

"Sending output to nohup.out" 消息is sent to STDERR,因此您可以通过常规方法捕获 STDERR

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

如果您根本不需要 stderr,请使用 /dev/null 而不是 /tmp/error_log.txt;并添加“> /tmp/myout.txt”来重定向标准输出。

或者通过 Perl 捕获(不要使用 system() 调用,而是使用 IPC::Open3capture command from IPC::System::Simple)

【讨论】:

请注意,仅捕获 STDERR,nohup 甚至不会打印“将输出发送到 nohup.out”消息。【参考方案2】:

怎么样:

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

nohup 的手册页说:

如果标准输出是终端, 如果将输出附加到“nohup.out” 可能,否则为 '$HOME/nohup.out'。 如果标准错误是终端, 将其重定向到标准输出。到 将输出保存到 FILE,使用 `nohup 命令 > 文件'。

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

请注意,如果您只重定向 STDOUT,nohup 会打印“将 stderr 重定向到 stdout”消息。

【讨论】:

以上是关于在 Perl 中使用 nohup 时如何抑制系统输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中捕获输出和退出代码时执行外部脚本?

46-nohup使用

使用nohup在后台执行python程序时需要增加-u选项才能马上通过print()输出日志

nohup是把进程弄到后台去了吗?

如何抑制 IWYU 系统标头错误?

nohup