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