Linux
如何創建程序樹?
我有一些程式碼可以殺死程序及其子/孫。我想測試這段程式碼。
目前我正在做
$ watch date > date.txt
,它創建一個孩子的過程。有沒有辦法創建父->子->孫樹?什麼命令可以做到這一點?
#!/bin/sh #This is a process with an id of $$ ( sleep 1000 )& #this creates an idle child ( (sleep 1000)& sleep 1000 )& #this creates an idle child and grandchild wait #this waits for direct children to finish
在我的系統上執行以上
./1.sh &
創建了以下程序樹:$ command ps -o pid,ppid,pgrp,stat,args,wchan --forest PID PPID PGRP STAT COMMAND WCHAN 24949 4783 24949 Ss /bin/bash wait 25153 24949 25153 S \_ /bin/sh ./1.sh sigsuspend 25155 25153 25153 S | \_ sleep 1000 hrtimer_nanosleep 25156 25153 25153 S | \_ sleep 1000 hrtimer_nanosleep 25158 25156 25153 S | \_ sleep 1000 hrtimer_nanosleep
您可以注意到,該樹具有相同的程序組 ( PGRP ),即 25153,這與第一個程序的PID相同。每當您以互動模式(或顯式打開作業控制)啟動新命令時,shell 都會創建一個程序組。
PGRP機制允許shell 一次向整個程序組發送信號,而不會產生競爭條件。這用於作業控制,以及當您的腳本執行和前台作業時,用於發送:
- (SIG) 使用者按 CC 時的INTR
- (SIG) 當使用者按下 C-\ 時退出
- (SIG)使用者按下 CZ 時的STP
您可以這樣做,例如:
kill -INTR -25153
其中INTR是信號,25153 是您要將信號發送到的程序組。25153 之前的
-
表示您的目標是PGRP id 而不是PID。在您的情況下,您應該發送的信號是
-TERM
(請求終止)。Term 是預設kill
發送的信號,但是,如果您針對的是組而不是PID ,則必須明確指定它。kill -TERM -25153
如果你想殺死你啟動的最後一個後台作業的程序組,你可以這樣做:
kill -TERM -$!