【发布时间】:2017-07-19 09:40:33
【问题描述】:
我有一个 Jenkins 作业,它使用 shell (bash) 脚本中的 psql 命令在 PostgreSQL 数据库中触发一个长时间运行的 SQL 函数。有时需要终止计算以解除对服务器上其他查询的阻塞。但是,如果手动中止作业,尽管psql 命令被终止,SQL 函数仍会在服务器上保持运行(在postgresql 进程内)。
我发现psql 需要被 SIGINT 中止才能正确取消查询,但 Jenkins 显然会将 SIGTERM 发送到作业执行中产生的所有进程。
我尝试在作业脚本中捕获 TERM 信号并将 SIGINT 发送到在后台运行的 psql,但 psql 仍然首先收到 SIGTERM 并在不停止查询的情况下完成。
根据this,Jenkins 会杀死脚本的整个进程组,但在单独的进程组 (set -m) 中启动 psql 也无济于事。
有什么方法可以在 Jenkins 作业中止时优雅地停止 psql 查询?
【问题讨论】: