如何杀死由一个进程派生的所有子进程,这个进程是从kill或kill-9上的脚本开始的



我有一个名为Launcher.sh的shell脚本,由java进程执行。java进程内部使用ProcessBuilder来执行bash脚本。

在Launcher.sh中,我有以下代码

#!/bin/bash
trap "kill -- -$$ && kill -INT -$PID" SIGINT SIGTERM SIGKILL
bash Process_A.sh &
pid=$!
echo $pid

Process_A脚本将生成另一个子进程Process_B。

当Launcher.sh脚本从其父java进程接收到"kill"命令或"kill-9"命令时,我想同时杀死Process_A和Process_B。

因此,我添加了一个陷阱命令来陷阱SIGINT、SIGTERM和SIGKILL中断。但当我做时

kill $pid

它只杀死进程A而不杀死子进程B。两者具有相同的PGID。

如何正确地杀死从launcher.sh脚本派生的所有子进程和孙进程?

以下是kill前后"psj"的实际输出。在我的脚本中,我做了"dse-spark",它在内部生成了一个java进程。我希望这个java进程在启动程序脚本得到终止信号时被终止

root@WeveJobs01:~# ps j
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 2380  2381  2381  2281 pts/1    59265 S        0   0:00 /bin/bash
    1 58917 58916  1152 pts/0     1236 S        0   0:00 bash /usr/bin/dse spark
58917 59041 58916  1152 pts/0     1236 Sl       0   0:07 /usr/lib/jvm/java-8-oracle/jre//bin/java -cp /etc/dse/spark/:/usr/share/dse/dse-
 2381 59265 59265  2281 pts/1    59265 R+       0   0:00 ps j
root@WeveJobs01:~# kill 58917
root@WeveJobs01:~# ps j
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 1152  1235  1235  1152 pts/0     1236 S        0   0:00 sudo -s
 1235  1236  1236  1152 pts/0     1236 S+       0   0:00 /bin/bash
    1 59041 58916  1152 pts/0     1236 Sl       0   0:23 /usr/bin/java -cp /etc/dse/spark/:/usr/share/dse/dse-
 2381 59513 59513  2281 pts/1    59513 R+       0   0:00 ps j

我试过这个。。当我做"杀死pid"时,pid就是脚本的pid。当它进入无限循环时,我遇到了分段故障

trap 'echo "Kill All"; kill -TERM -$$' TERM INT
bash child.sh &
PID=$!
wait $PID
trap - TERM INT
wait $PID
EXIT_STATUS=$?

我需要重置trap语句中的kill-term以防止无限循环。这起到了的作用

trap"trap-INT&&kill--$$"

有几种不同的方法可以杀死循环的Bash脚本,这取决于脚本的设置方式和您想要停止它的方式

使用kill命令向脚本进程发送信号。例如,您可以使用kill-9向脚本发送SIGKILL信号,脚本会立即终止它。替换为脚本的进程ID。您可以通过运行ps aux|grep来查找进程ID。

如果脚本在一个单独的终端窗口中运行,您只需关闭该窗口即可终止脚本。

如果脚本在后台运行,可以使用fg命令将其带回前台,然后按CTRL+C终止脚本。

如果脚本在一个可以用break语句中断的循环中运行,则可以在脚本中包含一个信号处理程序,用于捕获信号并中断循环。例如:

trap 'break' INT
while true; do
  # script code goes here
done

这将导致脚本脱离循环,并在收到INT信号时终止(例如,当您按下CTRL+C时)。

最新更新