使用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

参考

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信号用户将程序挂起并且放入后台


tim_xiao
144 声望2 粉丝

后端程序员