
プロセスとその子/孫を殺すコードがあります。このコードをテストしたいです。
現在私がやっていることは、$ watch date > date.txt
子と一緒にプロセスを作成することです。
作成する方法はありますか?父->息子->孫木?これを達成できるコマンドは何ですか?
答え1
#!/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最初のプロセス中。対話モードで新しいコマンドを開始するたびに(またはジョブ制御を明示的にオンにするたびに)、シェルはプロセスグループを作成します。
これPGRPこのメカニズムにより、シェルは競合状態を生成することなく、プロセスグループ全体に一度にシグナルを送信できます。これは、スクリプトが実行され、フォアグラウンドジョブが次の送信に使用されるときにジョブ制御に使用されます。
- (シグ(SIG))INTR ユーザーがCCを押したとき
- (シグ(SIG))辞める ユーザーがC-\を押すと
- (シグ(SIG))電車でユーザーがCZを押すと
たとえば、次のように同じことを実行できます。
kill -INTR -25153
どこINTRは信号で、25153 は信号が送信されるプロセスのグループです。-
25153以前は、目標が次のようになることを意味します。PGRP代わりにPID。
あなたの場合、送信する必要がある信号は-TERM
(終了要求)です。用語はシグナルのデフォルトkill
ですが、ターゲットがグループではなくグループである場合は、明示的に指定する必要があります。PID。
kill -TERM -25153
最後に開始したバックグラウンドジョブのプロセスグループを終了するには、次のようにします。
kill -TERM -$!
答え2
シェル呼び出しの追加
sh -c "watch date > date.txt"
より多くのレベルを得るには、周囲にシェルを追加します。
答え3
再帰スクリプトを作成できます。たとえば、ファイルから/tmp/run
#!/bin/bash
depth=${1:-3}
f(){
let depth--
if [ $depth -gt 0 ]
then $0 $depth
else sleep 999
fi
}
f
それでは。chmod +x /tmp/run
/tmp/run 3
答え4
freebsdのコマンドがps
プロセスツリーを生成できないようです。幸いなことにpstree
、これを正確に実行するプログラムを含むパッケージがあります。