java 捕获sigkill,如何杀死由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脚本从其父进程接收到“kill”命令或“kill -9”命令时,我想要同时杀死Process_A和Process_B .

所以我添加了一个trap命令来捕获SIGINT,SIGTERM和SIGKILL中断 . 但是,当我这样做

kill $pid

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

如何正确杀死我的launcher.sh脚本中生成的所有子进程和孙进程?

这是kill之前和之后“ps j”的实际输出 . 在我的脚本里面,我做了“dse spark”,它会产生一个java进程 . 我希望在launcer脚本获取kill信号时杀死这个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就是脚本 . 当它进入无限循环时,我得到分段错误

trap 'echo "Kill All"; kill -TERM -$$' TERM INT

bash child.sh &

PID=$!

wait $PID

trap - TERM INT

wait $PID

EXIT_STATUS=$?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值