6

从其中的 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

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

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

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

4

2 回答 2

17

如果您的 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中是同步运行的。

于 2013-03-27T01:31:25.587 回答
2

据我了解,问题是如何在 nohup 中运行命令状态。根据我的经验,即使它立即失败,您也很少有机会获得 COMMAND 退出状态。大多数时候你只是得到'nohup COMMAND &'退出状态,除非你像乔纳森提到的那样等待或同步。要在 nohup 之后立即检查命令状态,我使用:

 
  pid=`ps -eo pid,cmd | awk '/COMMAND/ {print $1}'`
  如果 [ -z $pid ]; 然后
     echo "命令失败"
  别的
     echo "命令在 nohup 中运行"
  菲
于 2016-01-11T17:21:08.053 回答