【问题标题】:How to kill waiting child processes in shell script [duplicate]如何在shell脚本中杀死等待的子进程[重复]
【发布时间】:2019-03-16 06:12:54
【问题描述】:

我有如下脚本

testscript.sh

#!/bin/bash

while true
do
  /sbin/tcpdump -n -c 2 -i eth0  >/tmp/pkt_eth0
  sleep 60
done

当我试图杀死它时,testscript.sh 消失但 tcpdump 等待过程仍然存在。同样对于testscript.sh,我无法使用killall,所以需要pid

$kill -15 pid

但更喜欢

$killall -15 testscript.sh

结束脚本和所有子进程。如何实现?

【问题讨论】:

  • 如果您在后台运行作业(将& 附加到命令中),并使用wait 命令等待完成,那么您拥有更多控制权。例如,您可以使用作业编号而不是 PID kill。您可以使用 trap 在脚本中捕获信号(不是 SIGKILL)。
  • 我使用trap添加了clean_up脚本,但是等待进程仍然无法以某种方式被杀死

标签: linux bash shell kill-process


【解决方案1】:

如果你在进程 id 前设置了一个减号,那么子进程也会被杀死。测试:

script.sh:

#!/bin/bash
while true
do
  ./script2.sh 
  sleep 60
done

script2.sh:

#!/bin/bash
for ((i=1;i<=10;i++))
do
    echo "$i"
    sleep 10
done

使用./script.sh 运行命令后,找到带有ps aux | grep script 的PID(来自不同的终端),然后使用:

kill -- -13859

这里 13859 是 script.sh 的 PID。运行ps aux | grep script 后,您会看到两个脚本都已终止。

来源:http://fibrevillage.com/sysadmin/237-ways-to-kill-parent-and-child-processes-in-one-command

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2012-09-30
    • 2018-03-08
    • 2016-01-24
    • 1970-01-01
    • 2013-03-26
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多