【问题标题】:How can i get the return code of a killed process in unix?如何在 unix 中获取已终止进程的返回码?
【发布时间】:2013-04-01 09:46:15
【问题描述】:

我有一个 bash 脚本,我通过将 SIGTERM 信号发送到它的进程 ID 来终止正在运行的进程。但是,我想知道我刚刚发送信号的进程的返回码。

这可能吗?

我不能使用“等待”,因为要终止的进程不是从我的脚本开始的,而且我正在接收 “pid ##### 不是这个 shell 的孩子”

我在命令行中进行了一些测试,在进程运行的控制台中,在我发送 SIGTERM 信号(从另一个控制台)之后,我检查了退出代码,它是 143。 我想从另一个脚本中终止该进程并捕获该数字。

【问题讨论】:

  • 是的,但我无法在控制台中执行该操作,因为正在运行的进程和我发送信号的脚本都是后台进程
  • 鉴于您的限制,这是不可能的。唯一的希望是将进程包装在可以将其退出代码捕获到文件中或回显到 stdout/err 的东西中。我会很高兴被证明是错误的。祝你好运。
  • 如果你想知道一个进程的返回码,最好不要杀死它...

标签: unix process kill sigterm


【解决方案1】:

正如shellter 所说,除了使用wait(或waitpid() 等...)之外,您无法获取进程的退出代码,并且只有当您是其父级时才能这样做。

但即使你可以,想想这个:

当您向进程发送 SIGTERM 时,只会发生以下三种情况之一:

  • 进程没有为SIGTERM 安装任何信号处理程序。在这种情况下,它会因信号而立即死亡。但在这种情况下,退出代码是无趣的——你已经知道它是什么了。在大多数平台上,它是 143(128 + SIGTERM 的整数值),不出所料,这表明进程由于 SIGTERM 而死亡。

  • 进程已将SIGTERM 配置为被忽略。在这种情况下,什么都不会发生,进程不会死,所以无论如何也没有退出代码。

  • 进程已为SIGTERM 安装了信号处理程序。在这种情况下,将调用处理程序。处理程序可能会做任何事情:可能什么都不做,可能立即退出,可能执行一些清理操作并稍后退出,可能完全不同。即使进程确实退出了,这也只是信号的间接结果,并且会在以后发生,因此没有退出代码可以直接从信号的传递中获得。

【讨论】:

  • 总结一下。谢谢你的信任,但我没有说任何关于wait :-!祝大家好运。
  • 附注:即使在调用SIGTERM 时可能会发生一些事情,但实际上可能需要此信息。示例:用于启动一堆进程并监视它们的活动的 UI。一旦每个进程停止(SIGTERMSIGINT 等),您可能希望在 UI 上提供视觉反馈是否发生了一些错误。
  • @rbaleksandar 然后希望提供视觉反馈的 UI 应该安排启动应用程序,因此它将是其父进程,因此它将能够使用 wait() 获取退出状态。
  • 有点。我没有这样做,但是我的 Qt 应用程序实际上正在启动完全分离的进程,然后通过 Unix 信号等控制这些进程。UI 中的反馈是通过使用各种系统工具提供的(例如,ps -p PID 如果进程带有给定 PID 否则返回 1 => 我们可以告诉 UI 进程是否正在运行)。我正在使用分离的进程,因为即使 UI 崩溃或退出,进程也必须继续运行,但进程不会被它停止。重新启动 UI 后,它必须能够从崩溃中恢复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2014-10-27
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
相关资源
最近更新 更多