2015-07-03 68 views
1

想要殺死樹的進程。 例如:A-> B-> C-> D->電子 我要殺死進程C,d,E而不是A和B.殺死另一個進程具有相同GID的進程

假設所有進程的父ID是1234

ps x -o "%p %r %y %x %c 
{PID_A} 1234 
{PID_B} 1234 
{PID_C} 1234 
{PID_D} 1234 
{PID_E} 1234 

我不能殺死-9 -1234,因爲它殺死A和B.

回答

0

你不應該做kill -9除後politer機制,如kill -1kill -15(又名kill -HUPkill -TERM)的最後手段都失敗了。

你的問題以A->B->C->D->E開頭,這表明A啓動B,B啓動C,C啓動D,D啓動E.但是,你說1234是所有B,C,D的父PID ,E,也可能是A(假設A不是PID = 1234)。因此,在第二種情況下,您有6個進程:1234和A到E,其中每個都由1234啓動。

在某些方面,它並不重要。殺死進程C,D,E而又不殺死A和B(以及1234)的唯一方法是列出C,D,E的進程ID。除非某些步驟已經採取措施將三個進程放入同一進程組或會話,並且在來自A,B(和1234)的單獨流程組或會話中,沒有任何替代方案。

你可以看一下kill()系統調用的規範:

如果PID大於0,SIG應發送到其進程ID等於PID過程。

如果PID是0,SIG應被髮送到的所有過程(不包括未指定的一套系統進程的),它的進程組ID等於所述處理組ID發送方的,以及用於其的方法具有發送信號的權限。

如果PID是-1,SIG應被髮送到的所有過程(不包括未指定的一套系統進程的)該過程具有許可發送該信號。

如果PID是否定的,但不是-1,SIG應被髮送到的所有過程(不包括未指定的一套系統進程的),它的進程組ID等於PID絕對值,併爲此過程有權發送信號。

這些是可用的信令選項。這些選項都不適用於組織進程1234和A ... E(殺死C,D,E並且離開1234,A,B不需要技能)。

+0

它只是一個例子,但在現實中,我不知道C有多少個孩子或大孩子。 那麼有什麼辦法可以殺死所有包括C在內的C的進程ID,而不是GID。 kill -9 PID_of_C不適用於我... –

+0

只有當C自己成爲過程組長並且其子女沒有成爲過程組領導者時,你才能殺死C及其後代。然後你可以發信號給過程組。如果進程忽略或接收信號而不退出,那麼它們不會死亡。當然,你無法捕捉或忽略SIGKILL,所以這是最後的選擇 - 但過去使用NFS(網絡文件系統)文件的進程可能會在網絡連接失敗時被阻止,並且沒有辦法即使使用SIGKILL也會殺死進程。重新啓動或修復網絡是修復它們的唯一方法。 –

+0

我通過setpgid()方法殺死了C和C下的孩子。 我將c的進程id分配給c的組id以及它的所有子組,它對C++來說工作正常。 但我想通過腳本而不是C++代碼來完成。 是否有類似於C++中的setpgid()的shell腳本功能? –