2010-06-07 49 views
0

我寫了一個需要連續運行的程序。但由於我是一個糟糕的程序員,它每隔一段時間就會崩潰。有沒有辦法讓另一個程序監視它並在崩潰時重新啓動它?linux - 檢查程序是否已經死了

+6

如果因爲糟糕的編程而崩潰,那就練習一下,成爲一個更好的程序員,並改進你的程序和設計,使其不會崩潰。那麼你將不必經歷這個過程。 – 2010-06-07 17:33:28

+2

不幸的是,老闆喜歡發送這種質量的代碼。 – 2010-06-07 17:36:18

+1

@DeSimone - 因爲第一次做它比第一次做得更便宜。 – KevinDTimm 2010-06-07 17:39:06

回答

2

不是很清楚,但是如果你是一個糟糕的程序員,那麼你的觀看編程也不會失敗;),你應該變得更好,這樣你纔不會有這個問題(因爲這個原因)。也就是說,你最終可能需要下面的答案。

但是,如果不可能變得更好,只需定期運行一個cron作業,在'ps'的輸出中查找您的程序名稱。而這個問題的答案可以從superuser.com

1

獲得無需第三方程序

所有這一切都可以與Linux inittab中

inittab MAN pages

查找來完成對「重生」

0

既然Stackoverflow是一個編程站點,讓我給你一個這樣一個觀察者將如何實現的概述。

首先要知道的是,你的觀察者將不得不自己啓動觀看的節目。你可以用forkexec來做到這一點。

然後你可以做的是等待程序退出。您可以根據具體需要使用等待系統調用(即waitwaitpidwait4)。你也可以抓住SIGCHLD,這樣你可以在你的孩子退出時得到異步通知(然後你需要撥打wait來獲得它的狀態)。

現在您已擁有狀態,可以通過宏信號WIFSIGNALED來判斷進程是否因信號而死亡。如果該宏返回true,則程序崩潰並需要重新啓動。

1

您可以使用supervisord

http://supervisord.org/

+0

+1,因爲這是Reddit使用的,所以它必須是體面的。 – 2010-06-07 18:27:29

0

它仍然不會持續運行,如果您有其他任務監控它...它仍然有停機時間短量,同時它重新啓動。此外,如果您充當網絡(或本地)服務器進程,您將失去有關正在進行的請求的任何狀態;我希望這是好的(當然你的客戶可能有內置超時和重試)。

最後,如果你的進程崩潰,而這是在存儲任何持久數據的中間,我希望它有一半的書面文件的應對機制等

但是,如果你想它是健壯的,所有這些東西都應該是真的,所以你可以安全地使用像supervisord這樣的東西。

0

我用Monit觀看我的節目和服務。