2014-03-27 69 views
3

我的進程啓動了一個進程 - 在這個例子中它是一個shell,但它真的適用於任何進程。當shell創建新進程並獲得它們的PID時,我需要得到通知。如何持續監控Linux中的進程創建?

我可以在任何給定時間拍攝整個工藝樹的快照(當然,pstree可以),但是如何監視具有給定PID的進程創建新進程?

  1. 監控網絡鏈路PROC接口:

    到目前爲止,我已經找到了幾種方法在How to monitor an external process for events by its PID in C?其中沒有真正解決我的問題,這樣做。 問題:需要root權限,我沒有。

  2. 自定義庫覆蓋加載到shell進程的系統調用LD_PRELOAD問題:它也會被shell的子項繼承,而且我不想 - 我只想監視shell。
  3. ptrace() ing殼。 問題:通知父母(即我的進程)有關創建新進程的標誌,即PTRACE_O_TRACEFORKPTRACE_O_TRACEVFORKPTRACE_O_TRACECLONE傳播給子進程,我只想監控shell。
  4. 使外殼合作。 問題:在BASH中,命令回調(如在undistract-me中使用)非常黑客。我還希望避免使用特定於shell的代碼。

我覺得我在這裏錯過了一些簡單的東西。我覺得我可以讓上述解決方案之一與更多黑客,但是...當然,我不必訴諸如LD_PRELOADptrace()大槍這樣一個簡單的任務,是嗎?

JFYI我在Vala編碼,但也歡迎C片段。

+0

所以爲了記錄我不得不讓殼合作。 ZSH在http://zsh.sourceforge.net/Doc/Release/Functions.html中記錄了pre-exec鉤子,KSH在http://www.manpagez.com/man/1/ksh/中記錄了一個調試鉤子,並且可以在https://github.com/jml/undistract-me找到向BASH添加預執行程序的hack – Shnatsel

回答