プロセスツリーの作成方法は?

プロセスツリーの作成方法は?

プロセスとその子/孫を殺すコードがあります。このコードをテストしたいです。

現在私がやっていることは、$ 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、これを正確に実行するプログラムを含むパッケージがあります。

関連情報