1

我有一个 bash 脚本可以连续调用一些 rake 任务。该脚本由持续集成服务器调用。问题是如果集成服务器终止任务(通过向脚本发送 SIGTERM),我无法让整个进程树被终止。例如,如果 Rake 正在使用 Parallel 功能运行一组 rspec 测试,则可以终止脚本和顶级 rake 命令,但不可避免地会有一些线程继续运行。

到目前为止,我已经尝试了许多在 bash 脚本中使用“trap”命令的不同方法。我尝试使用 pstree 查找所有子进程,使用“kill -9 0”杀死当前进程组等。但是,如果脚本在 rake 任务运行时被杀死,它似乎绕过了陷阱。据我所知,Rake 或者 Ruby 的线程库对进程组做了一些奇怪的事情,或者可能会干扰陷阱。

如果脚本不在 rake 任务的中间,它将正确捕获 SIGTERM,回显“Received SIGTERM”,然后杀死所有后代。

Rake 怎么可能干扰父进程(bash 脚本)中的陷阱语句?

4

1 回答 1

1

Bash 假设整个进程组都收到了信号,因此它将等待当前执行的命令完成以确定要做什么(更多信息)。在命令完成之前,陷阱不会运行。

如果您不想等待命令完成,您可以改用

trap 'kill $!' TERM
job &
wait $!

wait当 shell 收到 SIGTERM 时将立即退出,导致您的陷阱立即运行。

于 2013-01-29T00:45:00.313 回答