如何在unix中获取已终止进程的返回代码?
我有一个bash脚本,通过向进程ID发送SIGTERM信号来终止正在运行的进程。但是,我想知道刚刚发送信号的进程的返回代码 可能吗 我不能使用“等待”,因为杀戮的过程不是从我的脚本开始的,我正在接收 “pid不是这个外壳的孩子” 我在命令行中做了一些测试,在进程运行的控制台中,在我发送SIGTERM信号(从另一个控制台)之后,我检查了退出代码,结果是143。 我想从另一个脚本中终止进程并捕获该数字。如前所述,除了使用如何在unix中获取已终止进程的返回代码?,unix,process,kill,sigterm,Unix,Process,Kill,Sigterm,我有一个bash脚本,通过向进程ID发送SIGTERM信号来终止正在运行的进程。但是,我想知道刚刚发送信号的进程的返回代码 可能吗 我不能使用“等待”,因为杀戮的过程不是从我的脚本开始的,我正在接收 “pid不是这个外壳的孩子” 我在命令行中做了一些测试,在进程运行的控制台中,在我发送SIGTERM信号(从另一个控制台)之后,我检查了退出代码,结果是143。 我想从另一个脚本中终止进程并捕获该数字。如前所述,除了使用wait(或waitpid(),等等…)之外,您无法获取进程的退出代码,并且只有
wait
(或waitpid()
,等等…)之外,您无法获取进程的退出代码,并且只有在您是其父进程时才能这样做
但即使你可以,想想这个:
向进程发送SIGTERM时,只能发生以下三种情况之一:
- 进程尚未为
安装任何信号处理程序。在这种情况下,该信号会立即消失。但在这种情况下,退出代码是无趣的——你已经知道它是什么了。在大多数平台上,它是143(128+整数值SIGTERM
),这表明进程由于SIGTERM
而死亡,这并不奇怪SIGTERM
- 该进程已将
配置为忽略。在这种情况下,不会发生任何事情,进程不会消亡,因此无论如何都没有要获取的退出代码SIGTERM
- 该进程已为
安装了一个信号处理程序。在这种情况下,将调用处理程序。处理程序可能会执行任何操作:可能什么都不做,可能会立即退出,可能会执行一些清理操作,然后退出,可能会执行完全不同的操作。即使进程确实退出,这也只是信号的间接结果,并且会在稍后发生,因此没有直接来自信号传递的退出代码SIGTERM
wait
(或waitpid()
等…)之外,您无法获取进程的退出代码,并且只有在您是其父进程时才能获取
但即使你可以,想想这个:
向进程发送SIGTERM时,只能发生以下三种情况之一:
- 进程尚未为
安装任何信号处理程序。在这种情况下,该信号会立即消失。但在这种情况下,退出代码是无趣的——你已经知道它是什么了。在大多数平台上,它是143(128+整数值SIGTERM
),这表明进程由于SIGTERM
而死亡,这并不奇怪SIGTERM
- 该进程已将
配置为忽略。在这种情况下,不会发生任何事情,进程不会消亡,因此无论如何都没有要获取的退出代码SIGTERM
- 该进程已为
安装了一个信号处理程序。在这种情况下,将调用处理程序。处理程序可能会执行任何操作:可能什么都不做,可能会立即退出,可能会执行一些清理操作,然后退出,可能会执行完全不同的操作。即使进程确实退出,这也只是信号的间接结果,并且会在稍后发生,因此没有直接来自信号传递的退出代码SIGTERM
SIGTERM
时可能会发生一些事情,但实际上可能需要这些信息。示例:用于启动一系列进程并监视其活动的UI。一旦每个进程停止(SIGTERM
,SIGINT
等),您可能希望在UI上提供视觉反馈,以确定是否发生了错误。@rbaleksandar然后希望提供视觉反馈的UI应安排启动应用程序,因此它将是其父进程,因此它将能够使用wait()
获取退出状态。有点像。我没有这样做,但是我的Qt应用程序实际上是启动完全分离的进程,然后通过Unix信号等控制这些进程。UI中的反馈是通过使用各种系统工具提供的(ps-p PID
例如,如果找到具有给定PID的进程,则返回0,否则返回1=>我们可以告诉UI该进程是否正在运行)。我正在使用分离的进程,因为即使UI崩溃或退出,进程也必须继续运行,但进程不会被它停止。重新启动UI后,它必须能够从崩溃中恢复。这就是总结。感谢您的赞扬,但我没有说任何关于等待:-!祝大家好运。只需附带说明:尽管调用SIGTERM
时可能会发生一些事情,但实际上可能需要这些信息