1、常见信号
使用kill -l
命令就可以查看所有的信号,常见信号如下表:
信号名 | 信号编号 | 产生原因 | 默认处理方式 |
SIGHUP | 1 | 关闭终端 | 终止 |
SIGINT | 2 | ctrl + c | 终止 |
SIGQUIT | 3 | ctrl + \ | 终止+产生1个转储文件 |
SIGABRT | 6 | abort()函数 | 终止+转储 |
SIGPE | 8 | 算术错误 | 终止 |
SIGKILL | 9 | kill -9 pid | 终止, 不可捕获/忽略 |
SIGUSR1 | 10 | 自定义 | 忽略 |
SIGSEGV | 11 | 段错误 | 终止+产生1个转储文件 |
SIGUSR2 | 12 | 自定义 | 忽略 |
SIGALRM | 14 | alarm()函数 | 终止 |
SIGTERM | 15 | kill pid | 终止(可以被忽略) |
SIGCHLD | 17 | 子状态变化 | 忽略 |
SIGSTOP | 19 | ctrl + z | 暂停, 不可捕获/忽略 |
2、发送信号
可以将信号传递给程序或脚本。当按下ctrl+c
键时,SIGINT
将被发送到脚本,并按照定义的默认处理方式脚本终止。传递信号的另一种常用方法是使用kill
命令,其语法如下所示:
$ kill -signal pid
signal
是要传递的信号的数字或名称,pid
是信号应该发送到的进程ID。
例如,
如果要向一个进程发送kill信号,可以使用以下命令
$ kill -9 1231
kill -9
代表的信号是SIGKILL
,表示进程被终止,需要立即退出。进程ID为1231进程将退出。
3、捕获的信号
执行shell程序期间,当在终端上按ctrl+c
或Break键时,通常该程序会立即终止,命令提示符会返回。这种做法是不推荐的,可能会留下一堆不会被清理的临时文件。
如果要捕获信号进行处理,可以使用trap
命令:
$ trap command signals
command
可以是Linux命令,或者是用户定义的函数等,signal
可以是需要捕获信号的列表。
1)清理临时文件
捕获脚本中止信号,删除临时文件,然后在退出:
$ trap "rm -f /path/to/your/file exit" 2
捕获信号1或2进行处理:
$ trap "rm -f /path/to/your/file exit" 1 2
注意:rm
后面的exit
命令是必要的,因为如果没有它,程序将在接收到信号时停止执行时继续执行。
2)忽略信号
如果为trap
列出的命令为空,则接收到指定的信号时将被忽略。
例如,
$ trap '' 2
可以通过以下方式指定多个需要忽略的信号。
例如,
$ trap '' 1 2 3 15
注意:如果忽略一个信号,所有子shell程序也会忽略该信号。如果指定了接收信号时要采取的操作,则所有的子shell在接收到该信号时,还是采取默认操作。
3)恢复信号的默认操作
之前捕获的操作,如需要重置为默认操作,可以使用trap
命令:
例如,
$ trap 1 2 3 15
注意:在Shell脚本中不能捕获所有信号,像TERM、KILL之类的信号是无法被捕获的。