2012-09-06 51 views
1

我正在測試一些功能來監視進程,我需要模擬具有確定的「延遲」的長核心轉儲(例如,我需要使一個進程「轉儲核心」30秒)。我注意到,轉儲核心的過程是在不可中斷的睡眠中進行的,所以它不能被SIGKILL殺死,但是當我嘗試使用接收coredump的管道命令來模擬此行爲時,我可以輕鬆地殺死這樣的進程。那麼是否有某種方法可以使進程進入不間斷睡眠狀態(在ps中),並使其忽略SIGKILL?我怎樣才能把過程變成「不間斷睡眠」?

回答

1

要將進程置於可中斷睡眠模式,您將不得不進入內核代碼。 使用wake_up_interruptible和自旋鎖的功能,您將能夠達到此狀態。

-3

沒有辦法阻止SIGKILL。這是目的。擺脫過程的大錘法。 SIGKILL可以阻止的唯一方法是如果進程在內核中被鎖定。

+0

但在轉儲過程中,核心進程不受SIGKILL的影響。 –

+0

因此...在內核中被阻塞。 –

+0

如果你讓他們被STAT == D阻塞,至少在我們的系統(centos6.4)上你不能殺死他們,你需要解決潛在的問題。 – nhed

0

一個可靠的(如果很複雜的)方法是硬掛載一個NFS目錄,然後取下NFS服務器。

3

最正確的方法是使用冷凍箱cgroup。它在冷凍cgroup狀態的情況下將過程置於不間斷睡眠。

# mkdir /sys/fs/cgroup/freezer 
# mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer 
# mkdir /sys/fs/cgroup/freezer/frozen 
# echo FROZEN > /sys/fs/cgroup/freezer/frozen/freezer.state 
# echo `pidof you_process` > /sys/fs/cgroup/freezer/frozen/tasks 

要再次進行可中斷睡眠,只需將cgroup狀態更改爲THAWED即可。

+0

這對我有用,謝謝。出於某種原因,在向進程發送SIGTERM之後,'ps aux'的輸出只反映了狀態'D'。 –

相關問題