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进程。

在注销定时器时注意杀死进程的顺序,贸然杀了父进程,就找不到子进程了哦