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

中止时,如何使用SIGINT而不是SIGTERM终止Jenkins作业内的psql进程?,jenkins,psql,Jenkins,Psql,我有一个Jenkins的工作,它使用shell(bash)脚本中的psql命令在PostgreSQL数据库中激发一个长时间运行的SQL函数。有时需要终止计算以取消服务器上的其他查询。但是,如果手动中止作业,SQL函数将在服务器上保持运行(在postgresql进程内),尽管psql命令被终止 我发现SIGINT需要中止psql,以正确取消查询,但是Jenkins显然会将SIGTERM发送到作业执行中生成的所有进程 我尝试在作业脚本中捕获术语信号,并将SIGINT发送到后台运行的psql,但psq

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

我发现SIGINT需要中止
psql
,以正确取消查询,但是Jenkins显然会将SIGTERM发送到作业执行中生成的所有进程

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

根据Jenkins的说法,杀死脚本的整个进程组,但是在单独的进程组(
set-m
)中启动
psql
)也没有帮助


在Jenkins作业中止时,是否有任何方法可以优雅地停止
psql
查询?

我最终使用了这个解决方法。为psql进程添加陷阱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发布者构建步骤(通过SSH插件发布)运行脚本。要使作业正常工作,必须设置两个复选框:

  • 传输块中pty执行->高级按钮
  • 如果服务器块->高级按钮中发生错误,则生成失败