如何在中止时使用SIGINT而不是SIGTERM终止Jenkins作业中的psql进程?

时间:2017-07-19 09:40:34

标签: jenkins psql

我有一个Jenkins作业,在shell(bash)脚本中使用psql命令在PostgreSQL数据库中触发长时间运行的SQL函数。有时需要终止计算以解除对服务器上的其他查询的阻止。但是,如果手动中止作业,则SQL函数会在服务器上保持运行(在postgresql进程内),尽管psql命令已终止。

我发现SIGINT需要中止psql才能正确取消查询,但Jenkins显然会将SIGTERM发送给作业执行中产生的所有进程。

我尝试在作业脚本中捕获TERM信号并将SIGINT发送到在后台运行的psql,但psql仍然先收到SIGTERM并在不停止查询的情况下完成。

根据this Jenkins杀死了脚本的整个流程组,但在单独的流程组(psql)中启动set -m也无济于事。

有没有办法在Jenkins作业中止时优雅地停止psql查询?

1 个答案:

答案 0 :(得分:0)

我最终使用了这种解决方法。为psql进程添加trap SIGTERM信号,并在清理过程中使用普通SIGTERM终止正在运行的进程:

function clean() {
    echo "Interrupted: psql #$1" >&2
    kill -SIGINT $1
    wait $1
    echo "psql ended" >&2
}

psql -c 'select pg_sleep(10)' &
pid=$!

trap "clean $pid" SIGTERM

然后通过SSH Publisher构建步骤(通过SSH插件发布)运行脚本。必须设置两个复选框,作业才能正常工作:

  1. 在“转移”块中执行->“高级”按钮
  2. 如果服务器块中发生错误,则构建失败->“高级”按钮