Linux信号机制与信号处理

Linux信号机制与信号处理

信号(signal)是Linux进程间通信的一种机制,全称为软中断信号,也被称为软中断。信号本质上是在软件层次上对硬件中断机制的一种模拟。

常见信号


每种信号都会有一个默认动作。默认动作就是脚本或程序接收到该信号所做出的默认操作。常见的默认动作有终止进程、退出程序、忽略信号、重启暂停的进程等,上表中也对部分默认动作进行了说明。

发送信号

有多种方式可以向程序或脚本发送信号,例如按下<Ctrl+C>组合键会发送SIGINT信号,终止当前进程。

还可以通过 kill 命令发送信号,语法为:

1
kill -signal pid

signal为要发送的信号,可以是信号名称或数字;pid为接收信号的进程ID。例如:

1
kill -2 1001

SIGINT信号发送给进程ID为1001的程序,程序会终止执行。

kill的默认信号为SIGTERM15

捕获信号

1
2
3
4
5
6
7
8
9
console.log('pid: %d', process.pid);

setInterval(() => console.log(new Date()), 2000);

['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGFPE', 'SIGALRM', 'SIGTERM'].forEach((signal) => {
process.on(signal, () => {
console.log(signal);
});
});

如果在程序中捕获了信号,没有做退出处理,程序是不会退出的。可以在捕获信号后做一下清理工作然后退出。
如果需要退出,需要手动调用process.exit(0)(非0代表异常退出)
SIGKILL信号无法监听,无法被进程捕获,进程会立即退出。慎用kill -9

例子

  1. 使用kill -0检查进程

    kill -0不会给进程发送任何信号,但是仍会检查进程是否存在。如果进程存在返回0,不存在返回1。

    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh

    if kill -0 $BASHPID 2>/dev/null; then
    echo "process $BASHPID existence"
    else
    echo "process $BASHPID nexistence"
    fi

参考

本站采用「署名 4.0 国际」进行许可。