当子进程反复产生并杀死-9时,如何杀死bash脚本上的后台子进程?

时间:2018-07-12 19:26:06

标签: bash

我的bash脚本旨在重复启动程序,并在执行大约KILL_EVERY秒后将其关闭。问题是我用CTRL + C停止了脚本,它留下了实例化的最后一个进程。

我尝试为SIGINT设置陷阱并杀死进程$ ID,但是发生的是循环中断。我怀疑这是因为陷阱在第一个$ PROGRAM被首先杀死后会以某种方式激活,并杀死下一个实例(如果存在)。

如何解决该问题,以便脚本重复启动,等待KILL_EVERY秒然后杀死$ PROGRAM,但是在CTRL + C上不会使$ PROGRAM实例在后台运行?

[XXX@XXXX ~]$ sudo service gitlab restart

Starting both the GitLab Unicorn and Sidekiq/home/git/gitlab/config/unicorn.rb

/usr/local/rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/ext/builder.rb:212:in `initialize': Permission denied @ rb_sysopen - /usr/local/rvm/gems/ruby-2.2.5/extensions/x86_64-linux/2.1.0/bcrypt-3.1.11/gem_make.out (Errno::EACCES)

1 个答案:

答案 0 :(得分:-1)

您可以这样做:

trap 'kill -HUP -$$; exit' SIGINT
KILL_EVERY=${1:-0}
PROGRAM=path/to/program
if [ $KILL_EVERY -gt 0 ]; then
    while true ; do
        $PROGRAM & ID=$!
        sleep $KILL_EVERY
        kill -9 $ID
    done
else
    exec $PROGRAM
fi

这样做ctrl+c会杀死进程组中的所有内容。