Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在unix中获取已终止进程的返回代码?_Unix_Process_Kill_Sigterm - Fatal编程技术网

如何在unix中获取已终止进程的返回代码?

如何在unix中获取已终止进程的返回代码?,unix,process,kill,sigterm,Unix,Process,Kill,Sigterm,我有一个bash脚本,通过向进程ID发送SIGTERM信号来终止正在运行的进程。但是,我想知道刚刚发送信号的进程的返回代码 可能吗 我不能使用“等待”,因为杀戮的过程不是从我的脚本开始的,我正在接收 “pid不是这个外壳的孩子” 我在命令行中做了一些测试,在进程运行的控制台中,在我发送SIGTERM信号(从另一个控制台)之后,我检查了退出代码,结果是143。 我想从另一个脚本中终止进程并捕获该数字。如前所述,除了使用wait(或waitpid(),等等…)之外,您无法获取进程的退出代码,并且只有

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

可能吗

我不能使用“等待”,因为杀戮的过程不是从我的脚本开始的,我正在接收 “pid不是这个外壳的孩子”

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

如前所述,除了使用
wait
(或
waitpid()
,等等…)之外,您无法获取进程的退出代码,并且只有在您是其父进程时才能这样做

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

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

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

  • 该进程已将
    SIGTERM
    配置为忽略。在这种情况下,不会发生任何事情,进程不会消亡,因此无论如何都没有要获取的退出代码

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

如前所述,除了使用
wait
(或
waitpid()
等…)之外,您无法获取进程的退出代码,并且只有在您是其父进程时才能获取

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

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

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

  • 该进程已将
    SIGTERM
    配置为忽略。在这种情况下,不会发生任何事情,进程不会消亡,因此无论如何都没有要获取的退出代码

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


是的,但我不能在控制台中执行,因为运行的进程和我发送信号的脚本都是后台进程。考虑到您的限制,这是不可能的。唯一的希望是将流程包装成可以将其退出代码捕获到文件中,或者回显到stdout/err的内容。我很高兴被证明是错的。祝你好运。如果你想知道进程的返回码,最好不要终止它……是的,但我不能在控制台中执行,因为运行的进程和我发送信号的脚本都是后台进程。考虑到你的限制,这是不可能的。唯一的希望是将流程包装成可以将其退出代码捕获到文件中,或者回显到stdout/err的内容。我很高兴被证明是错的。祝你好运。如果你想知道一个进程的返回码,最好不要杀死它……这就是总结。谢谢你的表扬,但是我没有说任何关于等待的事!祝大家好运。请注意:尽管调用
SIGTERM
时可能会发生一些事情,但实际上可能需要这些信息。示例:用于启动一系列进程并监视其活动的UI。一旦每个进程停止(
SIGTERM
SIGINT
等),您可能希望在UI上提供视觉反馈,以确定是否发生了错误。@rbaleksandar然后希望提供视觉反馈的UI应安排启动应用程序,因此它将是其父进程,因此它将能够使用
wait()
获取退出状态。有点像。我没有这样做,但是我的Qt应用程序实际上是启动完全分离的进程,然后通过Unix信号等控制这些进程。UI中的反馈是通过使用各种系统工具提供的(
ps-p PID
例如,如果找到具有给定PID的进程,则返回0,否则返回1=>我们可以告诉UI该进程是否正在运行)。我正在使用分离的进程,因为即使UI崩溃或退出,进程也必须继续运行,但进程不会被它停止。重新启动UI后,它必须能够从崩溃中恢复。这就是总结。感谢您的赞扬,但我没有说任何关于
等待
:-!祝大家好运。只需附带说明:尽管调用
SIGTERM
时可能会发生一些事情,但实际上可能需要这些信息