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

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

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

現在私がやっていることは、$ 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 -$!

おすすめ記事