2012-02-13 74 views
0

我有一個從新創建的shell運行的腳本。 操作系統是紅帽企業Linux服務器版本5.4(Tikanga)。 在腳本檢測到某個應用程序(由腳本啓動)掛起的特定時刻,腳本嘗試終止它啓動的所有過程。我以爲,終止當前用戶在當前的shell啓動的所有進程正確的命令是:pkill殺死由父shell中的其他用戶啓動的sshd進程

pkill /? 

的問題是,它殺死了在母貝(由init.d中)開始的sshd和膩子控制檯斷開連接顯示錯誤信息。

我在想:

  1. 怎麼可能在特定的外殼特定用戶終止過程中母貝其它用戶開始了嗎?
  2. 什麼是正確的命令終止當前正在運行的腳本啓動的所有進程?

我已經找到了一些解決方案,我存儲所有PID和當腳本需要終止他們,我在循環運行以下命令:

[[email protected] ~]# pkill $(ps aux | grep $pid | awk '{print $2}') 

不過,我要尋找一個襯裏只是終止當前腳本啓動的所有進程。

回答

1

您可以按當前進程pid過濾子進程。 ps命令可以使用--ppid參數來執行此操作。

ps opid --ppid=7051 | tail -n +2 | xargs kill 

這裏tail -n +2 is剝去ps頭。

+0

我用$(echo $$)替換靜態進程id後試過了,它總是抱怨2個進程無法找到(kill 13925:No such process)。有什麼想法嗎? – aviad 2012-02-13 10:05:31

+0

這是因爲'ps'返回它自己的pid和'tail'的pid。你可以試試'ps opid --ppid = $$ | tail -n +2 | xargs睡眠「並在另一個終端運行'ps ax'。結果是'ps'和'tail'已經退出,但是'xargs'和'sleep'仍在運行。只需使用'ps opid --ppid = $$ | tail -n +2 | xargs kill&>/dev/null'。如果錯誤代碼是問題,您可以追加'; true',因此退出代碼始終爲0. – core1024 2012-02-13 11:35:09

1

我認爲終止當前用戶在當前的shell啓動的所有進程正確的命令是:

pkill /? 

這個命令匹配系統中的每一個過程,因爲它有效地只需要0符號從進程名稱到匹配。 pgrep -l /?表明。

特定shell中的特定用戶如何終止由父shell中的其他用戶啓動的進程?

man kill(2)

For a process to have permission to send a signal it must either be 
    privileged (under Linux: have the CAP_KILL capability), or the real or 
    effective user ID of the sending process must equal the real or saved 
    set-user-ID of the target process. In the case of SIGCONT it suffices 
    when the sending and receiving processes belong to the same session. 

你調用從用戶rootpkill

怎麼做才能正確的命令來終止腳本所啓動的所有進程正在運行?

bash開始時,它創建它自己的進程組。它創建的子進程被放入同一個進程組。因此:

kill -- -$$ 

殺死當前腳本啓動的所有進程。只要這些流程不成爲小組組長。

+0

該腳本不是由root運行的。會議是不一樣的。 Upvote第二個問題。 – aviad 2012-02-13 13:42:52