gpt4 book ai didi

linux - 如何杀死从 kill 或 kill -9 脚本启动的进程产生的所有子进程

转载 作者:太空狗 更新时间:2023-10-29 11:18:14 29 4
gpt4 key购买 nike

我有一个名为 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

它只会杀死 Process_A 但不会杀死子 Process_B。两者具有相同的 PGID。

我怎样才能正确地终止从我的 launcher.sh 脚本生成的所有子进程和孙进程?

这是 kill 之前和之后“ps j”的实际输出。在我的脚本中,我执行“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

我试过这个……当我执行“kill 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 -- -$$"

关于linux - 如何杀死从 kill 或 kill -9 脚本启动的进程产生的所有子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33851576/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com