linux 父程序被kill掉後子程序的狀態

2021-07-25 21:00:21 字數 3514 閱讀 8930

第一種情況:

顯然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 ...