如何杀死由kill或kill -9上的脚本启动的进程生成的所有子进程

时间:2015-11-22 04:25:04

标签: linux bash kill-process

我有一个名为Launcher.sh的shell脚本,由java进程执行。 java进程在内部使用ProcessBuilder来执行bash脚本。

在Launcher.sh中,我有以下代码

<target name="database" xsi:type="Database"
         connectionString="Server=127.0.0.1;Port=5432;User Id=test;Password=t;Database=Test;">
      <commandText>Insert into "system_logging" ("log_date","log_level","log_logger","log_message","log_machine_name","log_user_name","log_call_site","log_thread","log_exception","log_stacktrace") values (:time_stamp,:level,:logger,:message,:machinename,:user_name,:call_site,:threadid,:log_exception,:stacktrace)</commandText>

   <parameter name="@time_stamp" layout="${longdate}"/> 
  <parameter name="@level" layout="${level}"/> 
  <parameter name="@logger" layout="${logger}"/> 
  <parameter name="@message" layout="${message}"/> 
  <parameter name="@machinename" layout="${machinename}"/> 
  <parameter name="@user_name" layout="${windows-identity:domain=true}"/> 
  <parameter name="@call_site" layout="${callsite:filename=true}"/>

  <parameter name="@threadid" layout="${threadid}"/> 
  <parameter name="@log_exception" layout="${exception}"/> 
  <parameter name="@stacktrace" layout="${stacktrace}"/>
</target>  

Process_A脚本将生成另一个名为Process_B的子进程。

当Launcher.sh脚本收到&#34; kill&#34;时,我想杀死Process_A和Process_B。命令或&#34; kill -9&#34;命令来自其父进程的java进程。

所以我添加了一个trap命令来捕获SIGINT,SIGTERM和SIGKILL中断。 但是当我做的时候

#!/bin/bash
trap "kill -- -$$ && kill -INT -$PID" SIGINT SIGTERM SIGKILL
bash Process_A.sh &
pid=$!
echo $pid

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

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

这是&#34; ps j&#34;的实际输出。杀戮之前和之后。 在我的剧本中,我做了#34; dse spark&#34; inturn产生一个java进程。我希望当launcer脚本获得一个kill信号时,这个java进程被杀死

kill $pid

我试过这个......当我做的时候&#34;杀死pid&#34;其中pid是脚本的pid。当它进入无限循环时,我得到分段错误

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

1 个答案:

答案 0 :(得分:1)

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

陷阱&#34;陷阱-INT&amp;&amp;杀 - - $$&#34;