如何在自定义脚本中正确使用 nohup 命令

如何在自定义脚本中正确使用 nohup 命令

我有一个脚本,可以让我执行许多自动化任务。在脚本末尾,我运行以下命令:

nohup ./MyServer &

此命令在后台启动我的带有控制台的服务器。然后Nohup将创建一个nohup.out文件将包含标准控制台输出的内容。当按下回车键时,控制台显示TC>\n

问题是从脚本运行 nohup 命令将导致控制台中的 Enter 键保持按下状态。

这意味着从脚本运行 nohup 命令每秒会对 nohup.out 文件进行数百万次写入。

但是,如果我只是运行命令

nohup ./MyServer &

这些著作不会发生,我可以随时看到其中潜在的错误nohup.out文件。

我是否必须运行启动自动化任务的自定义脚本,等待该脚本执行结束(这需要时间),然后运行 ​​nohup 命令来启动我的服务器?

答案1

如果您在带有 GNU nohup 的机器上运行它(例如桌面/服务器 Linux),nohup 不仅会将信号SIGHUP的处置设置为“忽略”,并将 stdout/stderr 重定向到nohup.out,但是,如果它的标准输入是终端,还重定向标准输入/dev/null打开于只写模式,因此任何读取都会导致错误。

当从脚本运行后台命令时,例如foo &,其标准输入已经从/dev/null打开的位置重定向只读模式下,不会发生重定向,并且从中进行的任何读取都将导致 EOF 而不是错误。

因此,您可以使用脚本在终端中模拟 nohup 的行为:

(trap '' HUP; command 0>/dev/null >logfile 2>&1 &) 

相关内容