我有一个功能,可以进行相当多的密集处理。偶尔我需要能够停下来(即为了数据库维护),即使它在中途运行。我想发送它一个SIGINT,以便它可以优雅地结束它的工作。我发现只要我引入普通的perl中断处理程序,该函数就会停止正确响应中断。我该如何处理中断(即SIGTERM或SIGINT)
工作
CREATE OR REPLACE FUNCTION run_for_awhile() RETURNS void
AS $_X$
spi_exec_query('select pg_sleep(30)');
$_X$
LANGUAGE plperlu;
如果我在psql里select run_for_awhile()
,就可以输入:Ctrl+C
它取消。在实际的应用程序中,我会做select pg_cancel_backend(PID)
,但我的测试通过该方法获得了相同的结果。
如果我修改捕捉SIGINT和/或SIGTERM功能,信号被发送,但功能并没有注意到它,直到30秒后(当pg_sleep完成)。所以处理程序最终运行,但不是“立即”。
即
CREATE OR REPLACE FUNCTION run_for_awhile() RETURNS void
AS $_X$
$SIG{INT} = sub { die "Caught a sigint $!" };
spi_exec_query('select pg_sleep(30)');
$_X$
LANGUAGE plperlu;
你好,也许http://dba.stackexchange.com上的家伙可以帮助你更快? –