一、信号简介
有时候,你在Linux运行一个脚本,它陷入了出乎意料的循环,这时,你想要终止它而不用关掉整个Linux系统,我想大家都会想到了一个命令Ctrl + C。
Linux系统和应用程序可以产生超过30个信号,使用命令kill -l可以查看信号列表,其中1-31是普通信号(非可靠信号),34-64是实时信号(可靠信号):
下面列举几个常见的信号:
默认情况下,shell会将这些传给shell脚本程序来处理,而shell脚本默认的行为是忽略这些信号,有时候不太利于脚本的运行,为了避免这种情况,我们可以在脚本中加入识别、处理信号的命令。
二、信号产生
bash shell允许在键盘上的键组合生成两种基本的Linux信号,分别是终止进程和暂停进程。
1.终止进程
Ctrl + C 会生成SIGINT信号,并将其发送给shell中当前运行的所有进程。它会停止shell中运行的进程。
2.暂停进程
Ctrl + Z 会生成SIGTSTP信号,在进程运行中间暂停它,而不是终止,这个还是会有一些危险,例如这个进程正打开了一个关键的系统文件的文件锁。停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行。
三、捕捉信号
脚本可以选择不忽略信号,在信号出现时捕捉他们并执行其他的命令。我们使用trap命令来指定shell脚本观察并拦截哪些Linux信号,如果脚本收到了trap命令中列出的信号,它会阻止它被shell处理,而是在本地进行处理。
trap的命令格式:
Trap commands signals
这里的信号可以使用数值或者Linux信号名来指定。
下面举一个例子(忽略SIGINT和SIGTERM):
四、捕捉脚本的退出:
只需要在trap命令后面加上EXIT信号就行。
五、移除捕捉
移除捕捉也是使用trap命令,中间的commands 使用“-”代替。