我想捕獲進程entry
,exit
併爲整個系統維護一個日誌(可能是一個守護進程)。捕獲流程進入/退出的任何可能的解決方案?
一種方法是定期讀取/proc
文件系統並維護該列表,因爲我沒有看到爲/proc
註冊inotify
的可能性。另外,對於桌面應用程序,我可以得到dbus
的幫助,並且每當客戶端註冊到桌面時,我都可以捕獲。
但對於非桌面應用程序,我不知道如何從定期閱讀/proc
除了繼續。
請提供建議。
我想捕獲進程entry
,exit
併爲整個系統維護一個日誌(可能是一個守護進程)。捕獲流程進入/退出的任何可能的解決方案?
一種方法是定期讀取/proc
文件系統並維護該列表,因爲我沒有看到爲/proc
註冊inotify
的可能性。另外,對於桌面應用程序,我可以得到dbus
的幫助,並且每當客戶端註冊到桌面時,我都可以捕獲。
但對於非桌面應用程序,我不知道如何從定期閱讀/proc
除了繼續。
請提供建議。
如果你想記錄所有進程的進入和退出,你需要掛鉤到內核中。這意味着修改內核或者至少編寫一個內核模塊。 「linux安全模塊」肯定會允許鉤入,但我不確定是否有可能掛入出口。
如果你能偶爾退出打滑過去(如果二進制靜態鏈接或以某種方式避免你的環境設置)居住,有一個由預加載庫一個簡單的選擇。
Linux動態鏈接器有一個功能,如果環境變量LD_PRELOAD
(see this question)命名共享庫,它將強制將該庫加載到啓動過程中。所以你可以創建一個庫,在它的靜態初始化中告訴守護進程已經啓動了一個進程並執行它,這樣進程就可以知道進程何時退出。
靜態初始化最簡單的方法是用C++中的構造函數創建一個全局對象。動態連接器將確保靜態構造函數在庫加載時運行。
它也將努力使相應的析構函數運行時的進程退出,所以你可以只需登錄過程中構造函數和析構函數。但是,如果信號9(KILL)的進程死亡,我不確定其他信號會做什麼。
因此,你應該有一個守護進程,並在構造函數中講述進程啓動守護進程,並確保在處理退出它自己就會注意到。想到的一個選擇是向守護進程打開一個unix域套接字並將其打開。當進程死亡並且守護進程會注意到時,內核會關閉它。您應該採取一些預防措施來爲套接字使用高描述符編號,因爲某些進程可能會認爲低描述符編號(3,4,5)是空閒的,並且dup2
。不要忘記爲守護進程和系統提供更多的文件描述符。
注意,只是輪詢/ proc文件系統,你可能會錯過的,只有活一秒進程大量。其中有很多關於unix的。
也許移動安全的方法是創建作爲一個家長和孩子叉子一個超過程。每次孩子進程停止時,父親都可以找到它。如果架構適合您的需求,那只是一個想法。
當然,如果父級進程不可行,那麼你必須去內核。
你提到/ proc,所以我會假設你有一個linux系統。
安裝acct軟件包。 lastcomm命令顯示所有執行的進程和它們的運行持續時間,這就是你所要求的。讓你的程序「尾巴」/ var/log/account/pacct(你會在acct(5)中找到它的結構)和voila。不過,這只是終止通知。爲了檢測初創公司,你需要定期挖掘系統進程表,如果這是你真正需要的。
+1,因爲acct在此處提及。它是所謂的流程覈算的實現(http://www.faqs.org/docs/Linux-mini/Process-Accounting.html) – cateof 2012-01-11 16:27:08
下面是我們提出的解決方案的概要。
我們創建了一個程序,用於讀取系統能夠監視的所有可能應用程序的配置文件。該程序讀取配置文件,並通過命令行界面可以啓動或停止程序。程序本身在共享內存中存儲了一個表,標記了應用程序是否正在運行。任何人都可以訪問的界面可以獲得這些程序的狀態。這個程序還有一個報警系統,可以通過電子郵件發送/尋呼或者發出警報。
該解決方案不需要對內核進行任何更改,因此是一個不太痛苦的解決方案。
希望這會有所幫助。
你可能要編寫一個內核模塊;我不認爲你可以準確地從用戶空間做到這一點。 – 2012-01-11 13:51:38
相關:http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-September/003367.html – 2012-01-11 13:57:26
你可以嘗試使用ptrace(http://en.wikipedia.org/wiki/Ptrace),它可以讓你像gdb一樣捕獲系統調用。你需要以root身份運行你的程序。儘管如此,我還是不知道這種方法對於整個**系統有多「沉重」。 – 2012-01-11 13:58:01