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

时间:2013-03-27 01:10:27

标签: unix nohup

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成功退出了吗?

2 个答案:

答案 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