Linux

如何創建程序樹?

  • September 3, 2016

我有一些程式碼可以殺死程序及其子/孫。我想測試這段程式碼。

目前我正在做$ 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 -$!

引用自:https://unix.stackexchange.com/questions/234084