2013-11-25 79 views
4

我正在開發一個與多個進程通信的守護進程。守護進程無法始終監視進程,但它必須能夠正確識別進程是否死亡,釋放它爲之保留的恐慌資源。如何識別長時間運行的進程是否死亡?

進程可以與守護進程通信,在開始時給它一些信息,但反之亦然。所以守護進程不能僅僅詢問一個進程的身份。

最簡單的形式是使用他們的PID。但是最終另一個進程可以被分配相同的PID,而不需要我的工具注意。

更好的方法是使用PID加上過程開始的時間。具有相同PID的新流程將具有明顯的啓動時間。但我找不到如何以POSIX的方式獲得流程啓動時間的方法。使用ps或查看/proc/<pid>/stat似乎不夠便攜。

,這似乎符合POSIX標準的一個更復雜的想法是:

  • 每個進程創建一個臨時文件。
  • 將其鎖定使用flock
  • 告訴我的守護進程「我的身份與此文件相關聯」。
  • 任何時候守護進程都可以檢查臨時文件。如果它被鎖定,那麼這個過程仍然存在。如果不是,那麼這個過程就是死的。

但是,這似乎不必要的複雜。

有沒有更好的或標準的方法?

編輯:守護進程必須能夠在重新啓動後恢復,因此無法爲每個進程保留持久連接。

回答

1

但我找不到方法如何讓進程啓動時間在POSIX的方式。

嘗試standard "etime" format specifierLC_ALL=C ps -eo etime= $PIDS

憑心而論,我可能會建立自己的直播過程中的表,而這依賴於進程表和運行時間。這基本上是你的文件鎖定方法,儘管我可能將所有的鎖文件聚集在一個已知的地方,並通過PID命名,例如/var/run/my-app/8819.lock。事實上,這甚至可以改裝到長時間運行的進程上,因爲文件描述符上的文件鎖可以在exec()之間繼承。 (當然,如果我關心的長期流程有一個共同的家長,那麼我寧願查詢共同的家長,誰可以成爲一個可靠的權威機構,在哪個流程正在運行,哪些沒有。)

1

標準的方式是不必要的複雜的。這就是POSIX兼容環境中的生活......

1

除文件外,還有其他方法存在並且有各種優點/折衷 - 大多數「標準」IPC機制也適用於此 - 套接字,管道,消息隊列,共享內存......基本上選擇一種機制,允許你的應用程序向守護進程宣告它已經開始(也許它正在退出,以便有序關閉)。在它之間,它可以定期發送「我還在這裏」的消息,守護進程可以注意到它何時沒有得到,或者守護進程可以定期輪詢或執行什麼......有很多方法可以完成你想要的,但不知道更多關於你想要實現的確切架構,很難指出「最好的方式」...

+0

問題是守護程序必須能夠在重新啓動後恢復。這意味着它不能通過丟失套接字連接或類似的東西來檢測進程死亡。要求進程定期更新它們與守護進程的連接可能會起作用,儘管這會使進程更復雜。我正在尋找內核爲我管理的東西,而守護進程只是檢查它(如過程開始時間)。 –

+0

@PetrPudlák是的,好吧,每一項額外的要求都可能使解決方案變得更加複雜......這是非常正常的事情。 – twalberg