2013-04-09 62 views
0

我有一个bash脚本,通过向它的进程ID发送SIGTERM信号来杀死正在运行的进程。但是,我想知道刚发送信号的过程的返回码。如何获得unix中杀死进程的返回码?

这可能吗?

我不能用“等待”,因为过程杀不是从我的剧本开始,我收到 “PID #####是不是这个壳的孩子”

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

+0

它在'$?'? ... – 2013-04-09 19:34:58

+0

是的,但我不能在控制台中执行该操作,因为在发送信号的情况下,运行进程和脚本都是后台进程 – 2013-04-09 19:40:07

+0

,因为这是不可能的。唯一的希望是将进程封装到某个可以将其退出代码捕获到文件中,或者回显到stdout/err的东西中。我很乐意被证明是错误的。祝你好运。 – shellter 2013-04-09 23:48:55

回答

2

由于shellter表示,除了使用wait(或waitpid()等)之外,您无法获得进程的退出代码,并且只有在您是其父级时才能执行此操作。

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

当你发送的过程的SIGTERM,只有三种情况之一可能发生:

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

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

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

+0

这是总结它。感谢信用,但我没有提及任何关于“wait”的信息: - !祝你们好运。 – shellter 2013-04-11 11:48:25

+0

只需要注意一点:尽管在调用SIGTERM时只有少数情况会发生,但实际上可能需要这些信息。示例:用于启动一堆进程并监视其活动的UI。一旦每个进程停止('SIGTERM','SIGINT'等),您可能希望在UI上提供视觉反馈,看是否有错误发生。 – rbaleksandar 2016-01-22 12:26:14

+0

@rbaleksandar然后,希望提供视觉反馈的UI应该安排启动应用程序,因此它将是它的父进程,所以它将能够使用'wait()'来获得退出状态。 – Celada 2016-01-22 16:02:19