我有一个bash脚本,可以连续调用几个rake任务。此脚本由持续集成服务器调用。问题是如果集成服务器杀死任务(通过发送脚本SIGTERM),我无法让整个进程树被杀死。例如,如果Rake使用Parallel功能运行一组rspec测试,则可以终止脚本和顶级rake命令,但不可避免地会有一些线程继续运行。
到目前为止,我已尝试过在bash脚本中使用'trap'命令的许多不同方法。我已经尝试使用pstree查找所有子进程,使用“kill -9 0”来终止当前进程组等。但是,如果在rake任务运行时脚本被终止,则它似乎绕过了陷阱。据我所知,Rake,或者Ruby的线程库,对进程组做了一些奇怪的事情,或者可能会干扰陷阱。
如果脚本不在rake任务的中间,它将正确捕获SIGTERM,回显“Received SIGTERM”,然后杀死所有后代。
Rake如何干扰父进程中的陷阱语句(bash脚本)?
答案 0 :(得分:1)
Bash假设整个进程组收到了信号,因此它将等待当前正在执行的命令完成以确定要执行的操作(more info)。在命令完成之前,陷阱不会运行。
如果您不想等待命令完成,则可以改为使用
trap 'kill $!' TERM
job &
wait $!
当shell收到SIGTERM时, wait
将立即退出,导致陷阱立即运行。