当我按Ctrl + C时,如何杀死并等待后台进程在shell脚本中完成?

我试图设置一个shell脚本,以便它运行后台进程,当我按Ctrl + C shell脚本,它杀死了孩子,然后退出。

我设法得到的最好的是这个。 看起来在等待发生之前kill 0 -INT也会杀死脚本,所以shell脚本在孩子完成之前死亡。

关于如何让这个shell脚本发送INT后等待孩子死亡的任何想法?

 #!/bin/bash trap 'killall' INT killall() { echo **** Shutting down... **** kill 0 -INT wait # Why doesn't this wait?? echo DONE } process1 & process2 & process3 & cat # wait forever 

  • 如果有的话,search并删除与上一行中的注释匹配的行
  • Unix的Linux目录比较
  • find指向特定文件的所有sym链接
  • cd命令如何工作? (unix)
  • 通过行号从文本文件中选取一行
  • 旋转日志文件中间日志条目
  • 2 Solutions collect form web for “当我按Ctrl + C时,如何杀死并等待后台进程在shell脚本中完成?”

    首先,你应该知道kill 0发送信号给当前进程组中的所有进程。 (见杀(1) – Linux手册页 )我的猜测是,它比它应该杀死更多。 这就是为什么wait ,它由于某种原因被终止。 解决这个问题的最好方法就是迭代运行的作业 – 一个接一个地进行处理:这样我就可以保证信号只发送给那个时候的subprocess。

    为了得到这个工作,我做了几个testing,但是我坚持把SIGINT发送给subprocess。 他们简单不反应! 在网上search我已经find堆栈溢出这个答案:

    https://stackoverflow.com/questions/2524937/how-to-send-a-signal-sigint-from-script-to-script-bash

    所以真正的问题是, 你不能从一个脚本发送SIGINT到另一个脚本 ,因为在非交互式shell中信号被忽略。 我无法解决这个问题(使用bash -i调用子脚本不起作用)。

    我知道你可能想发送SIGINT,并等待subprocess正常closures,但是如果你不介意使用SIGTERM(或其他信号,但SIGINT),这是我写的最好的脚本:

     #!/bin/bash trap 'killall' INT killall() { echo '**** Shutting down... ****' jobs -pr for i in $(jobs -pr); do kill -TERM $i done wait echo DONE } ./long.sh & ./long.sh & ./long.sh & cat # wait forever 

    为了testing,我创build了这个long.sh脚本:

     #!/bin/bash trap 'killall' TERM echo "Started... $$" >> file.txt killall() { # shutting down gracefully echo "Finished... $$" >> file.txt exit # don't forget this! } # infinite loop while true; do echo loop >/dev/null ; done 

    在这最后一个脚本中,我没有使用sleep函数,因为它创build了一个新的进程,即使在脚本结束之后,它仍留在内存中。 在你的脚本中,你可以调用新的进程,但是你应该确保把SIGTERM(或者你使用过的其他信号)广播给它们。

    这似乎工作。 一定要使用“/ usr / bin / kill”而不是Bash内置的“kill”。

     [myles@marklar ~]$ /usr/bin/kill --version kill from util-linux-2.13-pre7 

    请注意,在非交互式Bash shell(例如脚本)中不启用作业控制。

     #!/bin/bash trap kill_jobs 2 kill_jobs() { while /usr/bin/kill 0; do :; done exit 0 } foo & foo & foo & sleep 777777 
    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.