如何从nohup获取正确的退出代码

pep*_*per 5 unix nohup

从nohup文档中info coreutils 'nohup invocation'可以看出:

Exit status:

 125 if `nohup' itself fails, and `POSIXLY_CORRECT' is not set
 126 if COMMAND is found but cannot be invoked
 127 if COMMAND cannot be found
 the exit status of COMMAND otherwise
Run Code Online (Sandbox Code Playgroud)

但是,我从nohup获得的唯一退出代码是1和0.我有一个nohup命令在脚本中失败,我需要适当的例外...并且根据这个文档,我会假设nohup退出代码应该是126.相反,它是0.

我正在运行的命令是: nohup perl myscript.pl &

这是因为perl成功退出了吗?

Jon*_*ler 13

如果您的shell脚本运行以下过程:

nohup perl myscript.pl &
Run Code Online (Sandbox Code Playgroud)

你或多或少放弃了收集退出状态的机会nohup.如果shell分叉则整个命令成功为0,如果shell无法分叉则失败为1.在bash,您可以等待后台进程死亡并通过wait以下方式收集其状态:

nohup perl myscript.pl &
oldpid=$!
...do something else or this whole rigmarole is pointless...
wait $oldpid
echo $?
Run Code Online (Sandbox Code Playgroud)

回显$?通常是指定PID的退出状态(除非指定的PID已经死亡并等待).

如果同步运行该进程,则可以检测到不同的退出状态:

(
nohup perl myscript.pl
echo "PID $! exited with status $?" >&2
) &
Run Code Online (Sandbox Code Playgroud)

现在你应该能够发现不同的退出状态nohup(例如尝试不同的拼写错误:nohup pearl myscript.pl等).

请注意,子shell作为一个整体在后台运行,但是nohup在子shell中同步运行.