我正在開發一個與多個進程通信的守護進程。守護進程無法始終監視進程,但它必須能夠正確識別進程是否死亡,釋放它爲之保留的恐慌資源。如何識別長時間運行的進程是否死亡?
進程可以與守護進程通信,在開始時給它一些信息,但反之亦然。所以守護進程不能僅僅詢問一個進程的身份。
最簡單的形式是使用他們的PID。但是最終另一個進程可以被分配相同的PID,而不需要我的工具注意。
更好的方法是使用PID加上過程開始的時間。具有相同PID的新流程將具有明顯的啓動時間。但我找不到如何以POSIX的方式獲得流程啓動時間的方法。使用ps
或查看/proc/<pid>/stat
似乎不夠便攜。
,這似乎符合POSIX標準的一個更復雜的想法是:
- 每個進程創建一個臨時文件。
- 將其鎖定使用
flock
- 告訴我的守護進程「我的身份與此文件相關聯」。
- 任何時候守護進程都可以檢查臨時文件。如果它被鎖定,那麼這個過程仍然存在。如果不是,那麼這個過程就是死的。
但是,這似乎不必要的複雜。
有沒有更好的或標準的方法?
編輯:守護進程必須能夠在重新啓動後恢復,因此無法爲每個進程保留持久連接。
問題是守護程序必須能夠在重新啓動後恢復。這意味着它不能通過丟失套接字連接或類似的東西來檢測進程死亡。要求進程定期更新它們與守護進程的連接可能會起作用,儘管這會使進程更復雜。我正在尋找內核爲我管理的東西,而守護進程只是檢查它(如過程開始時間)。 –
@PetrPudlák是的,好吧,每一項額外的要求都可能使解決方案變得更加複雜......這是非常正常的事情。 – twalberg