我有以下代码在PostgreSQL 9.4中启用逻辑解码:
pg_recvlogical -h localhost --slot test_slot --create-slot
pg_recvlogical -h localhost --slot test_slot --start -f -
我生成了一个node.js子进程来运行这段代码并监听更改,但是我不确定终止连接的正确程序是什么。我通常只是从命令行CNTRL+C
或者在代码中杀死子进程但我总是遇到pg_recvlogical: unexpected termination of replication stream:
错误。终止此连接的正确方法是什么?
答案 0 :(得分:0)
PostgreSQL documentation says,
-开始
从--slot指定的逻辑复制插槽开始流式传输更改,一直持续到被信号终止为止。如果服务器端更改流以服务器关闭或断开连接而结束,则除非指定--no-loop,否则请循环尝试。
因此,我假设适用标准的Linux信号含义。因此,SIGINT
或SIGQUIT
应该可以接受,让应用有时间完成。
我要做的是发送SIGINT
,然后进入循环,检查/proc/$PID_/stat
是否存在,自定义超时后,我将其发送给SIGKILL
和wait $PID_
它。
kill -2 $PID_
for i in `seq 1 8`; do
if [ ! -f /proc/$PID_/stat ] ; then
RETURN_CODE=`wait $PID_`;
break;
fi
sleep 1;
done
if [ -f /proc/$PID_/stat ] ; then
kill -9 $PID_;
RETURN_CODE=`wait $PID_`;
fi
这是Bash,但是任何不错的平台/语言都可以使用工具来实现。 缩短了,所以可能有一个错误:)