我有一个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
查询?
答案 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插件发布)运行脚本。必须设置两个复选框,作业才能正常工作: