终止 postgres 复制模式连接的正确方法

Amp*_*ter 5 postgresql postgresql-9.4

我有以下代码可以在 PostgreSQL 9.4 中启用逻辑解码:

pg_recvlogical -h localhost --slot test_slot --create-slot
pg_recvlogical -h localhost --slot test_slot --start -f -
Run Code Online (Sandbox Code Playgroud)

我生成一个 node.js 子进程来运行此代码并侦听更改,但是我不确定终止连接的正确过程是什么。我通常只是CNTRL+C从命令行或杀死代码中的子进程,但我总是收到错误pg_recvlogical: unexpected termination of replication stream:。终止此连接的正确方法是什么?

Ond*_*žka 2

PostgreSQL文档

--start
从 --slot 指定的逻辑复制槽开始流式传输更改,持续到被信号终止。如果服务器端更改流因服务器关闭或断开连接而结束,则循环重试,除非指定了 --no-loop。

所以我假设标准 Linux 信号含义适用。因此,SIGINTorSIGQUIT应该是可以接受的,给应用程序一些时间来完成。

我所做的是发送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
Run Code Online (Sandbox Code Playgroud)

这就是 Bash,但任何像样的平台/语言都会有工具来完成它。缩短了,所以可能有错误:)