2017-11-11 220 views
1

我正在嘗試使用NETLINK和CN_IDX_PROC來監視我的進程。這可行,但需要使用root權限啓動監視進程。我試圖通過在我的監視可執行文件(包括CAP_AUDIT_READ,CAP_SYS_ADMIN,CAP_SYS_PTRACE和CAP_IPC_OWNER)上設置文件系統的功能來修復它,但它不起作用,bind()仍然失敗,說「操作不允許「除非使用sudo開始。獲取有關進程終止的通知

有沒有辦法讓非根用我想要的方式使用netlink連接器套接字?

如果否,是否有其他可靠的方式來獲得通知時,其他(非子,在不同的用戶帳戶下運行)進程終止?我不想調查:它是嵌入式軟件,我沒有太多資源,我希望儘快得到通知。如果目標進程異常終止,我特別希望得到通知,例如由於分段錯誤,所以我不能依賴目標進程的合作。

在Windows上,我只是創建了&在目標進程中鎖定一個已命名的互斥鎖,並使監視進程進入休眠狀態,只要所有者進程死亡,互斥鎖就會保證被釋放。 Linux中是否有類似的IPC機制?

+0

你不能使用[waitpid(2)](http://man7.org/linux/man-pages/man2/waitpid.2.html)或類似的東西嗎? –

+0

@BasileStarynkevitch不能。所有這些系統調用都用於等待狀態更改'在調用進程的子進程中' – Soonts

+0

您可以將進程封裝在另一個進程中(只是'fork'-s和'waitpid'-s) –

回答

1

所以,你要通知有關進程的終止,例如運行某些程序foo

順便說一句,如果該進程如果該程序正確退出(通過明確地調用exit(3)或從main返回; crt0在這種情況下在剛剛返回main之後調用exit(3)),那麼註冊後的註冊表中的atexit(3)例程在你想要的時候運行。但是這個foo過程可能會被一些signal(7)(例如segmentation fault,或一些外部的kill(1)命令等等)終止,那麼當然_exit(2)沒有發生(並且也不是exit(3) ....)。

所以寫一個簡單的包裝程序(例如wrapfoo)在子​​然後fork(2) -s execve(2) -s foo,並在父waitpid(2)。那麼你的wrapfoo總是通知foo的結尾(包括foo由某個信號終止時)。它的行爲就好像它是一個運行foo的專用「外殼」(這裏只是爲了解釋這裏,wrapfoo而不是真的是Unix shell)。

(當然,你不希望運行wrapfoo將自身終止該進程)

編碼是wrapfoo程序是非常簡單的。你應該期待它是正確的。你可能(仔細)使用setuid技術讓他們使用不同的用戶(如果你需要的話)。請注意,setuid技巧是困難的,無小心可以打開security hole

在某些情況下,您可能會將wrapfoo的C源代碼與foo的代碼合併,但大多數時候您不想(separation of concerns原理)。特別是如果你使用危險的setuid技術,你希望你的wrapfoo.c儘可能地簡單(並且能夠證明它像你想要的那樣工作)。

閱讀一些有關Linux編程的好書,例如下載舊的Advanced Linux Programming(也here;它是合法免費下載)或更新的東西。 setuid技術和fork(2)execve(2)waitpid(2) ......背後的所有缺點很難解釋(所以我甚至不會在這裏嘗試)。另見credentials(7)。也許你可以使用fifo(7),使用一些建議鎖定(例如flock(2)lockf(3) ...);當一個進程死亡時,內核也會釋放它們。

+0

謝謝,結束了這麼做。我最初的基於pthread mutex的實現似乎太脆弱,太多可能的邊緣情況。至少目前爲止,這種方法似乎工作正常。順便說一下,我在包裝器中使用一個數據報unix域套接字來與真正的所有者進行通信。 無法合併包裝程序,因爲被封裝的進程是Microsoft的運行我的C#代碼的dotnet,那件事很大,我不想重新編譯和修補程序。 – Soonts

0

在pthread mutex中實現了一個名爲shared shared section的變通方法。

Funfact:當互斥被強制釋放,因爲所有者進程終止,其他進程的pthread_mutex_lock返回EOWNERDEAD代碼,但是互斥這之後不再使用,對互斥隨後的pthread_mutex_lock返回131 = EOTHER錯誤代碼。幸運的是,我只同步2個進程,所以我可以在同一個共享內存部分重新創建互斥鎖。

令人驚訝的代碼量複製一個WaitForSingleObject的Win32 API的:-(