从info coreutils 'nohup invocation'
中的nohup文档中可以看出:
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
然而,我从nohup获得的唯一退出代码是1和0.我有一个nohup命令在脚本中失败,我需要适当的异常......并且基于这个文档,我会假设nohup退出代码应为126.而是为0.
我正在运行的命令是:nohup perl myscript.pl &
这是因为perl成功退出了吗?
答案 0 :(得分:12)
如果您的shell脚本使用以下命令运行该过程:
nohup perl myscript.pl &
您或多或少放弃了从nohup
收集退出状态的机会。如果shell分叉则整个命令成功为0,如果shell无法分叉则失败为1。在bash
中,您可以等待后台进程死亡并通过wait
收集其状态:
nohup perl myscript.pl &
oldpid=$!
...do something else or this whole rigmarole is pointless...
wait $oldpid
echo $?
回显的$?
通常是指定PID的退出状态(除非指定的PID已经死亡并等待)。
如果同步运行该进程,则可以检测到不同的退出状态:
(
nohup perl myscript.pl
echo "PID $! exited with status $?" >&2
) &
现在你应该能够发现nohup
的不同退出状态(例如尝试不同的拼写错误:nohup pearl myscript.pl
等)。
请注意,子shell作为一个整体在后台运行,但nohup
在子shell中同步运行。
答案 1 :(得分:1)
据我所知,问题是如何在nohup中运行时获取命令状态。根据我的经验,即使马上失败,你也很少有机会获得COMMAND退出状态。大部分时间你都得到'nohup COMMAND&'退出状态,除非你等待或同步,如乔纳森提到的那样。要在nohup后立即检查COMMAND状态,我使用:
pid=`ps -eo pid,cmd | awk '/COMMAND/ {print $1}'` if [ -z $pid ]; then echo "the COMMAND failed" else echo "the COMMAND is running in nohup" fi