bash处理信号
发送信号
kill
格式:kill [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
可以发送进程号为pid的进程,也可以发送作业号为jobspec的进程
sigspec可以是信号数字也可以是信号名,信号名可以不带SIG
kill命令默认发送SIGTERM信号,接收到SIGTERM信号的进程会结束运行
终端中,Ctrl+C给前台进程发送INT信号,进程退出,退出状态为130,为信号编号加128
处理信号
建立信号回调函数
trap cmd signal1 signal2 signal3 ...
cmd可以是一系列命令或一个函数的名字,也可以为空,将执行默认行为
Shell脚本编程感兴趣的信号
信号 | 对应ID | 行为 | 含义 |
SIGHUP | 1 | Term | Hangup detected on controlling terminal |
SIGINT | 2 | Term | Interrupt from keyboard |
SIGQUIT | 3 | Core | Quit from keyboard |
SIGKILL | 9 | Term | Kill signal |
SIGALRM | 14 | Term | Timer signal |
SIGTERM | 15 | Term | Termination signal |
Shell脚本有个假的信号0,在退出时产生,可以为这个信号定义函数使脚本结束时执行某些操作
多次为同一个信号定义操作,以最后一次为准
忽略信号
在trap中使用空字符串或冒号就行。
trap ' ' 2 //注意引号的存在
设置定时器
其实就是设置一个后台的子进程在睡眠一定事件后给本进程发送SIGALARM信号。
方式:sleep $time && kill -s 14 $$ &
此命令产生bash子进程后,由bash子进程产生sleep进程。
在注销定时器时注意杀死进程的顺序,贸然杀了父进程,就找不到子进程了哦
转载于:https://blog.51cto.com/qianyang/1620558