SHELL脚本学习总结(第五话)脚本控制

@@@    信号处理

        Linux利用信号与运行在系统中的进程进行通信。我们可以利用这些信号来停止、启动、终止进程。可以通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。

最常见信号

信号

描述快捷键
1SIGHUP挂起进程 
2SIGINT终止进程Ctrl+c
3SIGQUIT停止进程(暂停)Ctrl+z
9SIGKILL无条件终止进程 
# 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文件中。

以上就是第五话内容。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值