2014-02-22 18 views
0

我有一個調度腳本(dispatcher.sh)啓動的進程:如何控制這樣通過在Unix /調度員的Linux

for system in a b c 
do 
    cd /usr/xyz/$system/ 
    mkdir -p /usr/xyz/$system/time 
    { time `./run_program.sh;wait` ;} > /usr/xyz/$system/time/time.log 2>&1 & 
done 

我寫這篇推出在每個文件夾和記錄run_program.sh執行時間。每個run_program.sh中的任務各不相同,有些會分叉子進程和孫進程。

  1. 我希望能夠停止/殺死每個run_program.sh及其衍生的子進程和孫子進程。

  2. 我也想知道每個run_program的子進程和孫進程正在運行。有什麼辦法可以檢查叉子樹嗎?

編輯:

我沒有我的系統上pstree,所以我很難對直觀地理解父進程和後代的過程之間的關係PID。如果我殺了父進程,後代進程會被殺死嗎?我目前使用

ps -eo pid,pgid,args | awk '{if($2==PGID){print $1}}' PGID=pid| xargs kill -9 

殺死一個父進程的後代進程。假設A叉B和B叉C(A-> B-> C),並且我殺死了B進程,C會自動被殺死嗎?我怎樣才能殺死包括A和B的進程?

+0

使用'pstree'來查看進程樹,'-p'選項將顯示所有的PID。然後你可以用'kill '殺死他們。 – Barmar

回答

0

以下將是正確的,如果這兩個假設成立:

  1. run_program.sh腳本不退出之前任何其子女/孫子
  2. 孩子/孫子不會成爲會議的領導人。

如果是這種情況,那麼您可以在新會話中運行run_program.sh,以便它和它的所有子/孫都具有相同的進程組ID。

然後,您可以通過殺死腳本及其所有兒童/孫子:

kill -9 -PID 

其中PIDrun_program.sh腳本本身的進程ID。使用-PID將信號發送給進程組的所有成員。

您還可以使用如下命令孩子/孫子的列表:

ps -eao pid,pgrp,args | awk '{if($2==PGRP){print $0}}' PGRP=PID 

其中PIDrun_program.sh腳本本身的進程ID。

您可以修改您的run_program.sh以將其PID(shell變量$$)寫入文件,以便您輕鬆檢索它。

0

您可以通過調用Bash builtin $!來獲取最近執行的後臺進程的進程ID。

然後,您可以kill -9 PID殺死一個進程ID的所有後代。

你可以存儲陣列中的進程ID,並完成類似把他們全部殺死後信號中斷。

for system in a b c 
do 
    cd /usr/xyz/$system/ 
    mkdir -p /usr/xyz/$system/time 
    { time `./run_program.sh;wait` ;} > /usr/xyz/$system/time/time.log 2>&1 & 
    pids+=($!) 
done 
proc_kill() { 
    kill -9 ${pids[@]} 
} 
trap proc_kill SIGINT 
相關問題