如何创建进程树?

Var*_*run 5 linux command-line process command

我有一些代码可以杀死进程及其子/孙。我想测试这段代码。

目前我正在做$ watch date > date.txt,它与孩子一起创建一个过程。

有没有办法创建一个-> 子-> 孙子树?什么命令可以做到这一点?

PSk*_*cik 5

#!/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
Run Code Online (Sandbox Code Playgroud)

./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
Run Code Online (Sandbox Code Playgroud)

您可以注意到树具有相同的进程组 ( PGRP ) 25153,它与第一个进程的PID相同。每当您以交互模式(或显式打开作业控制)启动新命令时,shell 都会创建一个进程组。

所述PGRP机构允许壳体在一次信号发送到的整个过程组而不产生的竞争条件。这用于作业控制,以及当您的脚本运行和前台作业时,用于发送:

  • (SIG) INTR 当用户按下 CC 时
  • (SIG) QUIT 当用户按下 C-\
  • (SIG)用户按下 CZ 时的STP

您可以通过执行相同的操作,例如:

kill -INTR -25153 
Run Code Online (Sandbox Code Playgroud)

其中INTR是信号, 25153 是要将信号发送到的进程组。在-之前的25153个手段您指定了PGRP ID,而不是一个PID

在您的情况下,您应该发送的信号是-TERM(请求终止)。Term 是默认信号kill发送,但是,如果您的目标是 group 而不是PID,则必须明确指定它。

kill -TERM -25153
Run Code Online (Sandbox Code Playgroud)

如果要杀死上次启动的后台作业的进程组,可以执行以下操作:

kill -TERM -$!
Run Code Online (Sandbox Code Playgroud)