当进行socket read时,进程并不会因为收到signal要求退出而就直接答应退出。
php 程序接收mysql binlog。
kill -QUIT pid
来停止进程时,没有效果,进程不退出。因为有两套数据源,本地和测试环境。当连接本地mysql,就无法kill掉。连接测试mysql,就可以kill掉。这是个坑点,当时不能理解。
通过打印日志发现:
逐渐逼近真实问题的历程
, 问对问题
,找到真正的问题
):
socket_read signal
这是最基础的关键词block on socket_read kill
无果,换个角度描述send signal to process block on socket_read
再次换描述send signal to exit socket_read
换signal to exit socket_read
换can't receive signal while socket_read
逼近真相can't receive signal while read block
如上,我发现了问题的核心:
虽然还不能100%解释所有问题,但现在突破点有了,即第一点。那么现在来验证这个:system call可以不回应signal
。
首先,根据所得知识,是可以显式让syster call来回应的,这是可以配置的(通过设置RESTART标记位)。C语言中,可以用sigaction
,php中没有找到对应的函数。但是pcntl_signal
本身提供了第三个参数来开控制。默认是true
,也就是说默认不回应signal call(自动重启,不退出)。
现在,把代码中pcntl_signal
加上第三个参数,运行,执行kill -QUIT pid
,成功!进程退出;同时提示Warning: socket_read(): unable to read from socket [4]: Interrupted system call in
。如此,确实是接收到了signal,并且回应了。