【问题标题】:Get exit status of a process in bash在bash中获取进程的退出状态
【发布时间】:2016-04-25 09:50:54
【问题描述】:

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

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

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

然后检查 WIFSIGNALED / WIFSTOPPED 等状态。

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

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

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

【问题讨论】:

  • 你在用c++调用脚本,用c++获取退出状态--不要再调用另一个脚本,那样做的事情太多了。

标签: c++ bash


【解决方案1】:

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

每个命令都返回一个退出状态(有时称为返回 状态或退出代码)。一个成功的命令返回一个0,而一个 不成功的返回一个通常可以解释的非零值 作为错误代码。表现良好的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

【讨论】:

  • 我不这么认为,b/c system() 已经在给他同样的信息 $?做。虽然这个答案得到了支持,但它适用于调用另一个脚本的 bash 脚本,而不是调用 bash 脚本的 c++ 程序。根据我对 OP 的理解。
  • 如果我没记错的话,来自 OP '但是,我可以通过编写 bash 脚本从 .Test 程序的 pid 中获取退出状态代码,而不是编写包装程序吗?这基本上是 bash 脚本调用另一个脚本。如果发现不相关,我可以删除帖子,在这种情况下不是。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多