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

Get exit status of a process in bash

本文关键字:退出 状态 取进程 获取 bash      更新时间:2023-10-16

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

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

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

然后检查 WIFSIGNALED/WIFSTOP 等状态。

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

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

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

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

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

# Non-zero exit status returned -- command failed to execute.
echo $?    
  
echo
# Will return 113 to shell.
# To verify this, type "echo $?" after script terminates.    
exit 113             
# By convention, an 'exit 0' indicates success,
# while a non-zero exit value means an error or anomalous condition

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

# Some random number for the process-id is returned
./foo.sh &
[1] 28992          
# Get process id of the background process
echo $!          
28992 
# Waits until the process determined by the number is complete
wait 28992       
[1]+  Done         ./foo.sh
# Prints the return code of the process
echo $?          
0

另请查看 Bash 黑客维基 - 退出状态

你正在接近这个错误 - 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