在bash中获取进程的退出状态

时间:2016-04-25 09:50:55

标签: c++ bash

我有一个名为Test的c ++可执行文件。我想在执行完成后找出GetExitCodeProcess()代码。

我可以通过在另一个包装器程序中编写以下内容来找出状态代码:

...
int status = system("./Test");

然后检查WIFSIGNALED / WIFSTOPPED等状态。

但是,不是编写包装器程序,我可以通过编写bash脚本从.Test程序的pid中获取退出状态代码吗?

编辑: 执行./Test后在bash中写'$'是否能解决上述问题?

编辑:摘要是 - 当我从命令行运行可执行文件时,我如何(不是程序)获得退出状态。

2 个答案:

答案 0 :(得分:3)

你可以在执行命令/ bash后执行echo $?,这将输出程序的退出代码。

每个命令都返回退出状态(有时称为返回 状态或退出代码)。成功的命令返回0,而a 不成功的一个返回通常可以解释的非零值 作为错误代码。行为良好的UNIX命令,程序和实用程序返回 成功完成后,0退出代码,但有一些例外情况。

echo $?    # Non-zero exit status returned -- command failed to execute.

echo

exit 113   # Will return 113 to shell.
           # To verify this, type "echo $?" after script terminates.

#  By convention, an 'exit 0' indicates success,
#+ while a non-zero exit value means an error or anomalous condition.

或者,如果您希望识别后台进程/脚本的返回代码(以nohup开头或在后台&运算符中运行),您可以启动进程/脚本的pid并等待它终止然后获得退出代码。

$ ./foo.sh &
[1] 28992          # Some random number for the process-id

$ echo $!          # Get process id of the background process
28992 

$ wait 28992       # Waits until the process determined by the number is complete

[1]+  Done         ./foo.sh

$ echo $?          # Prints the return code of the process
0

更多信息@ http://tldp.org/LDP/abs/html/exit-status.html

答案 1 :(得分:1)

你正在接近这个错误 - system()已经返回存在状态:成功为零,失败为非零。可能发生的情况是您的“测试”脚本编写错误或您正在测试“状态”错误。我见过开发人员的以下脚本错误。

run_some_java
echo "Done"

他们在任何时候都没有跟踪退出代码,脚本会返回echo命令的最后一个退出代码。这使它永远成功。这里有两种正确退出的方式(我知道其他编码器的东西比一些更先进的方法更好,但我认为这不是这个线程的意思)。抓取,然后走路,然后跑。

如果您需要退出状态,但希望执行所有shell命令。

return_code=0

mv $letters $ARCHIVE
return_code=$(($return_code + $?))

mv $letters $ARCHIVE
return_code=$(($return_code + $?))

exit $return_code

如果你想在失败时退出,可以set -e查看,这是另一种方式。

mv $letters $ARCHIVE || exit 1
mv $letters $ARCHIVE || exit 2