@@@ 信号处理
Linux利用信号与运行在系统中的进程进行通信。我们可以利用这些信号来停止、启动、终止进程。可以通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。
最常见信号 | |||
信号 | 值 | 描述 | 快捷键 |
1 | SIGHUP | 挂起进程 | |
2 | SIGINT | 终止进程 | Ctrl+c |
3 | SIGQUIT | 停止进程(暂停) | Ctrl+z |
9 | SIGKILL | 无条件终止进程 |
# sleep 100 ###休眠100秒
^C ###Ctrl+c终止了以上命令
#
# sleep 100 ###休眠100秒
^Z ###Ctrl+z暂停了以上命令
[1]+ Stopped sleep 100
# ps -l ###使用ps命令可以查看作业的状态
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 41191 41184 0 80 0 - 6672 - pts/0 00:00:00 bash
0 T 0 41253 41191 0 80 0 - 1820 - pts/0 00:00:00 sleep ###T代表暂停
0 R 0 41279 41191 0 80 0 - 11351 - pts/0 00:00:00 ps
# kill -9 41253 ###你可以用kill命令发送一个SIGKILL信号(9)来终止它
# ###终止了以后屏幕不会有任何输出,但是按下回车就会显示
[1]+ Killed sleep 100
&&& 捕获信号并转化成其他命令执行
trap命令允许你来指定shell脚本需要拦截的Linux信号。当脚本收到了trap命令中列出的信号,就会交由本地处理,转化成其他命令进行执行。
trap命令的格式是:
trap commands signals trap 命令 信号
cat jbkz002.sh
#!/bin/bash
# Testing signal trapping
trap "echo 'Sorry! Now Ctrl+C will no over this script!'" SIGINT
echo "This is a test script."
###trap将SIGINT也就是Ctrl+c转变其他命令
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
# ./jbkz002.sh
This is a test script.
Loop #1
Loop #2
Loop #3
^CSorry! Now Ctrl+C will no over this script! ###尝试按下Ctrl+c后没有退出
Loop #4
Loop #5
Loop #6
^CSorry! Now Ctrl+C will no over this script! ###尝试按下Ctrl+c后没有退出
Loop #7
Loop #8
Loop #9
Loop #10
&&& 捕获脚本退出
# cat jbkz003.sh
#!/bin/bash
# Testing signal trapping
trap "echo 'Sorry! This script is over!'" EXIT ###使用EXIT就能捕获脚本的退出
echo "This is a test script."
count=1
while [ $count -le 3 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
# ./jbkz003.sh
This is a test script.
Loop #1
Loop #2
Loop #3
Sorry! This script is over!
如果你想在不同位置进行不同的捕获与命令,那你只需要在脚本内重新使用trap命令就可以了。
如果你需要删除某个捕获,那就请使用 -- 。
trap "echo 'XXXXX'" SIGINT ##捕获
trap -- SIGINT ##使用 -- 取消捕获(也可以使用trap - SIGINT)
&&& 后台运行脚本
只需要在命令后面加上&即可。
# cat jbkz004.sh
#!/bin/bash
# Testing signal trapping
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
date
sleep 1
count=$[ $count + 1 ]
done > jbkz004.log
# ./jbkz004.sh & ###后面跟上&就成了后台运行
[1] 43341 ###显示此进程PID
# cat jbkz004.log ###检查脚本运行情况,结果OK
Loop #1
Fri Sep 25 14:54:33 CST 2020
Loop #2
Fri Sep 25 14:54:34 CST 2020
Loop #3
Fri Sep 25 14:54:35 CST 2020
......
有时你会想在终端会话中启动shell脚本,然后让脚本一直以后台模式运行到结束,即使你退
出了终端会话。这种情况你可以使用nohup命令。
# nohup ./test.sh & ###格式如左,非常简单。
[1] 8356
$ nohup: ignoring input and appending output to 'nohup.out'
###nohup会自动将STDOUT和STDERR的消息重定向到nohup.out文件中。
以上就是第五话内容。