首页 > 代码库 > 处理信号

处理信号

Linux使用信号与系统上运行的进程进行通信!系统和应用程序生成的信号有30多个,常见的如图:

信号描述
1SIGHUP挂起进程
2SIGINT终端进程
3SIGQUIT停止进程
9SIGKILL无条件终止进程
15SIGTERM如果可能的话终止进程
17SIGSTOP无条件停止,但不终止进程
18SIGTSTP停止或暂停进程,但不终止进程
19SIGCONT重新启动停止的进程

默认情况下,bash shell会忽略它接收的任何SIGQUIT(3)和SIGTERM(15)信号。但是,bash shell会处理它收到的任何SIGHUP(1)和SIGINT(2)信号


生成信号:

bash shell可以使用键盘上的组合键,生成两个基本的Linux信号。若需要暂停或者停止,就可以派上用场!

  1. 中断进程(Ctrl+C)可以生成SIGINT信号

  2. 暂停进程(Ctrl+Z)可以生成SIGTSTP信号
    中断进程和暂停进程不同,暂停进程仍然保留在内存中,能够从停止的地方继续运行

[root@localhost ~]# sleep 5

[1]+  Stopped                 sleep 5

方括号[1]:数字1是shell分配的作业编号(job number)

[root@localhost ~]# ps au

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root      6904  0.0  0.0   4916  1520 pts/1    Ss   11:06   0:00 -bash

root      7548  0.0  0.0   3960   476 pts/1    T    15:34   0:00 sleep 5

root      7555  0.0  0.0   4504   936 pts/1    R+   15:38   0:00 ps au

ps命令将停止作业的状态显示为T,只需要再次键入exit命令,shell将退出,并终止停止作业!

还可以使用Kill命令终止它!

[root@localhost ~]# kill -9 7548


捕捉信号:

trap命令指定能够通过shell脚本监控和拦截linux信号。如果脚本收到trap命令中列出的信号,它将不被shell处理

trap命令格式:

trap commands signals

#!/bin/bash

trap "echo Haha" SIGINT SIGTERM

echo "This is a test program"

count=1

while [ $count -le 10 ]

do

  echo "Loop #$count"

  sleep 10

  count=$[ $count +1 ]

done

  echo "This is the end of the test program"


[root@localhost ~]# ./test48.sh 

This is a test program

Loop #1

Loop #2

Loop #3

Loop #4

Haha

Loop #5

Haha

Loop #6

Haha

Loop #7

Haha

Loop #8

Haha

Loop #9

Haha

Loop #10

Haha


每次按Ctrl+C组合键时,脚本执行trap命令中指定的echo语句,显示“Haha ”


捕获脚本退出:

命令格式:trap command EXIT

#!/bin/bash

trap "echo byebye" EXIT

count=1

while [ $count -le 5 ]

do

  echo "loop #$count"

  sleep 3

  count=$[ $count + 1 ]

done


[root@localhost ~]# ./test49.sh 

loop #1

loop #2

loop #3

loop #4

loop #5

byebye


按Ctrl+C组合键时,出发trap命令


移除捕获:

要移除捕获,使用破折号作为命令和想要恢复正常行为的信号列表:

#!/bin/bash

trap "echo byebye" EXIT

count=1

while [ $count -le 5 ]

do

  echo "loop #$count"

  sleep 3

  count=$[ $count + 1 ]

done

trap - EXIT

echo "I just removed the trap"

[root@localhost ~]# ./test49.sh 

loop #1

loop #2

loop #3

loop #4

loop #5

I just removed the trap



本文出自 “linux运维分享” 博客,请务必保留此出处http://liangey.blog.51cto.com/9097868/1575045

处理信号