2013-04-09 50 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