trap -l
和kill -l
都可以列出来信号所有值。
而trap "命令1;命令2;" 信号
可以捕捉到信号
之后再执行命令1
、命令2
等命令,这里的命令可以不止两条。
快捷键产生信号
echo "This is a test" > trapTest.txt
将This is a test
写入到trapTest.txt
,按下Ctrl+c能够引发SIGINT
信号,trap "cat trapTest.txt" SIGINT
在捕捉到信号
之后,输出^CThis is a test
,^C
是默认输入,一般按下Ctrl+c就会输出,This is a test
是cat trapTest.txt
输出结果。
trap "echo ' interrupt';ls -a" SIGINT
会在按下Ctrl+c之后先输出^C interrupt
,然后再输出ls -a
执行的结果。
kill产生信号
killSignalInterrupt.sh
先输出进程号,然后会捕捉到信号2
,然后输出signal 2
,而后边while
语句是一个死循环,为了避免killSignalInterrupt.sh
过快退出,不能捕捉到信号2
。
#!/bin/bash
echo $$
trap "echo signal 2" SIGINT
while :
do
:
done
chmod u+rx killSignalInterrupt.sh
给所属用户组添加上读和执行权限。
./killSignalInterrupt.sh &
后台执行,还需要按一下回车键。
kill -信号 进程号
可以向进程号
发送信号
,比如kill -2 27420
。
kill -9 27420
可以把进程27420
终止。
需要注意的是,9号信号不能阻塞,也不能捕获。
killSignalKill.sh
里边的内容如下:
#!/bin/bash
echo $$
trap "echo signal 9" SIGKILL
while :
do
:
done
./killSignalKill.sh &
后台运行程序,kill -9 29259
发现没有输入signal 9
,而是直接把29259
关闭了。
此文章为7月Day 31学习笔记,内容来源于极客时间《Linux 实战技能 100 讲》。