我有一个脚本,可以让我执行许多自动化任务。在脚本末尾,我运行以下命令:
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 &)