【问题标题】:How to kill all child processes spawned by a process started from a script on kill or kill -9如何杀死由kill或kill -9上的脚本启动的进程产生的所有子进程
【发布时间】:2016-02-24 09:50:45
【问题描述】:

我有一个名为 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 脚本生成的所有子进程和孙子进程?

这是杀死前后“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=$?

【问题讨论】:

  • SIGKILL 是不可捕获的(这是杀死的重点)。否则你怎么能杀死一个捕获SIGKILL并忽略它的恶意进程?改为杀死该组。
  • 我无法捕获 SIGKILL 是有道理的。我仍然可以捕获 SIGTERM 或 SIGINIT 对吗?如何在收到 SIGTERM 时终止进程组?
  • 第一个问题:是的。第二个问题:kill [options] 0kill [options] -- -$$kill [options] $(jobs -p)
  • 所以我尝试了这个,我得到一个分段错误错误,因为当我执行“kill pid”时它会进入一些无限循环。陷阱'回声“杀死所有”; kill -TERM -$$' TERM INT bash child.sh & PID=$!等待 $PID 陷阱 - TERM INT 等待 $PID EXIT_STATUS=$?
  • 您捕获了一个 SIGTERM,然后发送另一个带有 kill 的 SIGTERM?那很愚蠢(明显的无限循环)。你想杀死它,只需kill -9(又名kill -KILL)。

标签: linux bash kill-process


【解决方案1】:

我需要在 trap 语句中重置 kill -term 以防止无限循环。这有效

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2023-03-18
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多