我有一个名为Launcher.sh的外壳脚本,该脚本由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。
因此,我添加了一个trap命令来捕获SIGINT,SIGTERM和SIGKILL中断。但是当我这样做
kill $pid
它只会杀死Process_A,而不会杀死子Process_B。两者具有相同的PGID。
如何正确杀死从launcher.sh脚本生成的所有子进程和孙进程?
这是杀死之前和之后的“ 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是脚本的那个。进入无限循环时出现细分错误
trap 'echo "Kill All"; kill -TERM -$$' TERM INT
bash child.sh &
PID=$!
wait $PID
trap - TERM INT
wait $PID
EXIT_STATUS=$?
我需要在trap语句中重置kill -term以防止无限循环。这工作
陷阱“陷阱-INT &&杀死--$$”
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句