使用swoole进行进程相关编程时,经常会遇到关于进程信号的问题,在这里做一个整理
查看信号列表
[vagrant@localhost tmp]$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
swoole 中使用signal进行异步信号监听,特别注意不能用户阻塞的程序中,不然会导致注册的监听回调函数得不到调度.
// swoole用来设置异步信号监听
Swoole\Process::signal(int $signo, callable $callback): bool
// swoole用来向进程发送信号 默认SIGTERM
Swoole\Process::kill(int $pid, int $signo = SIGTERM): bool
参考
- https://wiki.swoole.com/#/other/signal Linux 信号列表
SIGCHLD(17)
子进程退出的时候会向其父进程发送一个SIGCHLD信号
Swoole\Process::signal(SIGCHLD, function ($sig) {
//必须为false,非阻塞模式
while ($ret = Swoole\Process::wait(false)) {
echo "PID={$ret['pid']}\n";
}
});
swoole监听SIGCHLD信号,设置回调函数对子进程进行非阻塞回收
SIGTERM(15)
正常结束的信号,kill命令默认信号.
// 默认发送信号 SIGTERM
Swoole\Process::kill(int $pid, int $signo = SIGTERM): bool
SIGKILL(9)
强制进程退出。一般情况下使用SIGTERM即可。SIGKILL会导致进程立刻退出,不会做相关清理性工作
SIGKILL和SIGSTOP一般不会被程序caught到(参考go os.signal包)
SIGQUIT(3)
键盘终止信号 相当于输出 Ctrl+\ 快捷键
SIGINT(2)
键盘终止信号 相当于输出 Ctrl+C 快捷键
Swoole\Process::signal(SIGINT, function () {
echo "INT\n";
});
Swoole\Timer::tick(5000, function () {
});
Swoole\Event::wait();
SIGHUP(1)
用在用户终端连接结束时发出(正常和非正常都包括),通知统一session内的各个作业。如果程序中 没有捕捉该信号,默认当当前进程退出。
Swoole\Process::signal(SIGHUP, function ($sig) {
$myPid = getmypid();
// 需要人工kill掉进程
Swoole\Process::kill($myPid);
});
SIGUSR1(10)
用户用来设置自定义信号
SIGTSTP(20)
设置进程中断(进程挂起),在shell中的 Ctrl+Z 实际就是向程序发送SIGTSTP信号用户将程序挂起并且放入后台
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。