第一種情況:
顯然kill掉父程序,子程序也消亡了!
第二種情況:
我寫了兩個指令碼a.sh 和b.sh, 在a.sh中呼叫b.sh,執行後顯然有兩個程序,而且a.sh為b.sh的父程序,然後我再另外乙個terminal中kill 掉a.sh程序,但b.sh過寄給init程序,而不會終止!
我的例子如下:
[root@qht2 ~]# cat a.sh
#!/bin/sh
echo "a begin"
./b.sh
echo "a end"
[root@qht2 ~]# cat b.sh
#!/bin/sh
echo "b begin"
sleep 180
mkdir abcdef
echo "b end"
[root@qht2 ~]# ./a.sh
a begin
b begin
在這裡等待(因為b.sh中有sleep 180)
開啟另乙個terminal,檢視程序
[root@qht2 ~]# ps -ef | grep sh
。。。。。。
root 3984 3749 0 11:05 pts/0 00:00:00 /bin/sh ./a.sh
root 3985 3984 0 11:05 pts/0 00:00:00 /bin/sh ./b.sh ##顯然b.sh是a.sh的子程序
root 3990 3838 0 11:05 pts/1 00:00:00 grep sh
[root@qht2 ~]# kill 3984
[root@qht2 ~]# ps -ef | grep sh
。。。。。。
root 3985 1 0 11:05 pts/0 00:00:00 /bin/sh ./b.sh
root 3992 3838 2 11:06 pts/1 00:00:00 grep sh
第一ternimal中的顯示如下:
[root@qht2 ~]# ./a.sh
a begin
b begin
terminated
但b.sh還是會執行(因為生成了abcdef目錄)!
這兩種情況的區別是:
父程序退出,子程序被init領養,繼續執行,這才是正常的吧
而前乙個,從名字看明顯是乙個守護程序,id=3803的是會話首程序,也是程序組的組長,kill掉它,會導致sighup傳送給該程序組的每乙個程序(就是所有父程序為3803的那些),預設情況下,sighup會終止程序,所以全沒了.
詳細解釋:
所有程序都是屬於乙個程序組的,而程序組又屬於乙個會話.
普通的程序所屬的會話有控制終端,守護程序所屬會話沒有控制終端.
普通會話的首程序,同時也是建立與控制終端聯絡的程序,在它被kill掉時,會向前臺程序組就(a.sh)傳送sighup訊號.預設情況下,接收到sighup的程序會被終止.此時後台程序組(b.sh)不受影響.
守護程序的會話,因為沒有控制終端,所以就沒有前後臺程序組之分,會話首程序同時也是程序組組長.它被kill掉會向該組每個程序傳送sighup,導致組中程序被中止.
第二個試驗,乙個指令碼呼叫另乙個指令碼的行為,建立了乙個新的程序組,指令碼a.sh是程序組組長,但卻不是所在會話的首程序或控制程序,所以它被kill掉,不影響同組的程序(b.sh),此時init程序會自動領養指令碼b所在程序,並在它執行到結束時**它所占用的資源.
可以用ps -eo pid,ppid,pgrp,session,comm跑一下.
對於第一種情況,就是守護程序,應該會發現那一堆程序的session(會話id)和pgrp(組id)都一樣且是相同的,而且正好等於子程序的ppid,同時也是你kill掉那個程序的pid.這樣可以證實你kill掉的是會話首程序.
對於第二種情況,你會發現,程序a和b,session和pgrp是一樣的,但兩者卻並不相同,session的值雖無法確定,但pgrp卻應該正好是程序a的pid,這說明了程序a是組長但卻不是會話首程序,所以kill掉它不會導致子程序被結束.
批量kill掉linux中的程序
原文 ps ef grep php grep v grep awk xargs kill 9 管道符 用來隔開兩個命令,管道符左邊命令的輸出會作為管道符右邊命令的輸入。下面說說用管道符聯接起來的 幾個命令 ps ef 是linux 裡檢視所有程序的命令。這時檢索出的程序將作為下一條命令 grep m...
Linux下根據程序名稱kill掉對應程序
linux下根據程序名稱kill掉對應程序 記錄帖,此指令碼來自於組內一位經驗豐富的程式設計師,梁同學。bin sh function m killpid then echo e 033 1 32m r n kill program c id ps grep grep v grep awk if n...
Linux批量kill程序
使用awk批量殺程序的命令 ps ef grep firefox grep v grep awk sh 說明 列出了當前主機中執行的程序中包含firefox關鍵字的程序 ps ef grep firefox grep v grep 列出了要kill掉這些程序的命令,並將之列印在了螢幕上 ps ef ...