如何终止由 kill 或 kill -9 上的脚本启动的进程产生的所有 child 个进程
How to kill all child processes spawned by a process started from a script on kill or 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 的 child 进程。
我想在 Launcher.sh 脚本从它的 parent java 进程。
所以我添加了一个陷阱命令来捕获SIGINT、SIGTERM和SIGKILL中断。
但是当我做
kill $pid
它只会杀死 Process_A 但不会杀死 child Process_B。两者具有相同的 PGID。
我怎样才能正确地终止从我的 launcher.sh 脚本生成的所有 child 和 grandchild 进程?
这里是 "ps j" kill 前后的实际输出。
在我的脚本中,我执行了 "dse spark",这又产生了一个 java 进程。我希望这个 java 进程在 launcer 脚本收到终止信号时被终止
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 -INT && kill -- -$$"
我有一个名为 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 的 child 进程。
我想在 Launcher.sh 脚本从它的 parent java 进程。
所以我添加了一个陷阱命令来捕获SIGINT、SIGTERM和SIGKILL中断。 但是当我做
kill $pid
它只会杀死 Process_A 但不会杀死 child Process_B。两者具有相同的 PGID。
我怎样才能正确地终止从我的 launcher.sh 脚本生成的所有 child 和 grandchild 进程?
这里是 "ps j" kill 前后的实际输出。 在我的脚本中,我执行了 "dse spark",这又产生了一个 java 进程。我希望这个 java 进程在 launcer 脚本收到终止信号时被终止
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 -INT && kill -- -$$"