资讯动态

Shell编程——信号及trap命令

发布时间:2026/9/14 1:16:28 来源:尧图企业网站定制
信号及trap命令1、信号知识1.1、信号介绍1.2、信号列表2、使用trap控制信号3、Linux信号及trap命令的生产应用案例1、信号知识1.1、信号介绍运行Shell脚本程序时如果按下快捷键Ctrlc或Ctrlxx为其他字符​程序就会立刻终止运行。在有些情况下我们并不希望Shell脚本在运行时被信号中断此时就可以使用屏蔽信号手段让程序忽略用户输入的信号指令从而继续运行Shell脚本程序。简单地说Linux的信号是由一个整数构成的异步消息它可以由某个进程发给其他的进程也可以在用户按下特定键发生某种异常事件时由系统发给某个进程。1.2、信号列表在Linux下和信号相关的常见命令为kill及trap命令本章将重点讲解如何使用trap命令以及如何利用trap控制的跳板机脚本来使用信号。执行kill -l或trap -l命令可以列出系统支持的各种信号多达64个如图所示。下面将对企业实战中Linux系统的重要信号进行说明见表。在使用信号名时需要省略SIG前缀。通常需要忽略的信号包括HUP、INT、QUIT、TSTP、TERM等对应的信号编号分别为1、2、3、20、15。Shell脚本中既可以用数字来代表信号也可以使用信号的名字来代表信号如果读者想要了解关于信号的更多知识可以加本书的QQ交流群本书前言中有提供​群里有详细的文档说明。2、使用trap控制信号trap命令用于指定在接收到信号后将要采取的行动信号的相关说明前面已经提到过。trap命令的一种常见用途是在脚本程序被中断时完成清理工作或者屏蔽用户非法使用的某些信号。在使用信号名时需要省略SIG前缀。可以在命令提示符下输入命令trap -l来查看信号的编号及其关联的名称。trap命令的参数分为两部分前一部分是接收到指定信号时将要采取的行动后一部分是要处理的信号名。trap命令的使用语法如下trapcommandsignalsignal是指接收到的信号command是指接收到该信号应采取的行动。也就是trap’命令命令’ 信号编号或trap’命令命令’ 信号名范例测试trap命令捕获Ctrlc信号。[rootoldboy ]# trap echo oldboy 2 #当执行此命令时按Ctrlc键就会执行echo命令这里结尾的2就是Ctrlc键对应的数字信号。[rootoldboy ]# ^Coldboy #按Ctrlc键后调用echo命令输出结果。[rootoldboy ]# ^Coldboy #按Ctrlc键后调用echo命令输出结果。[rootoldboy ]# trap echo oldgirl INT #当执行此命令时按Ctrlc键就会执行echo命令这里结尾的INT就是Ctrlc键对应的信号名称。[rootoldboy ]# ^Coldgirl #按Ctrlc键后调用echo命令输出结果。[rootoldboy ]# ^Coldgirl #按Ctrlc键后调用echo命令输出结果。用stty -a可以列出中断信号与键盘的对应信息如下[rootoldboy ]# stty -aspeed38400baud;rows20;columns103;line0;intr^C;quit^\;erase^?;kill^U;eof^D;eolundef;eol2undef;swtchundef;start^Q;stop^S;susp^Z;rprnt^R;werase^W;lnext^V;flush^O;min1;time0;-parenb-paroddcs8-hupcl-cstopbcread-clocal-crtscts-cdtrdsr-ignbrk-brkint-ignpar-parmrk-inpck-istrip-inlcr-igncricrnl ixon-ixoff-iuclc-ixany-imaxbel-iutf8opost-olcuc-ocrnlonlcr-onocr-onlret-ofill-ofdelnl0 cr0 tab0 bs0 vt0 ff0 isig icanon iextenechoechoe echok-echonl-noflsh-xcase-tostop-echoprtechoctl echoke范例测试按下Ctrlc组合键而引发的INT(2)信号。[rootoldboy ]# trap 2 #执行动作处为空此命令可以用来屏蔽与数字对应的Ctrlc信号。[rootoldboy ]# #此时执行Ctrlc键无任何反应。[rootoldboy ]# trap : 2 #恢复Ctrlc信号。[rootoldboy ]# #此时可以执行Ctrlc了。[rootoldboy ]# trap echo -n you are typing ctrlc 2[rootoldboy ]# ^Cyou are typing ctrlc[rootoldboy ]# ^Cyou are typing ctrlc[rootoldboy ]# ^Cyou are typing ctrlc[rootoldboy ]# ^Cyou are typing ctrlc范例同时处理多个信号。执行任何一个对应信号的事件时都会执行前面对应的动作因为动作为空所以执行后没有任何反应。[rootoldboy ]# trap 1 2 3 20 15 #执行这些数字信号什么都不做。[rootoldboy ]# trap : 1 2 3 20 15 #执行这些数字信号恢复对应功能。[rootoldboy ]# ^C[rootoldboy ]# trap HUP INT QUIT TSTP TERM #执行这些名称信号什么都不做。[rootoldboy ]# trap : HUP INT QUIT TSTP TERM #执行这些名称信号恢复对应功能。[rootoldboy ]# trap echo {1..64} #屏蔽1-64的所有数字信号。3、Linux信号及trap命令的生产应用案例范例开发脚本实现触发信号后清理文件功能。脚本如下[rootoldboy scripts]# cat 17_4_1.sh#! /bin/bash#Author:oldboy trainingtrapfind /tmp -type f -name oldboy_|xargs rm -f exitINT#捕获Ctrlc键后即执行find删除命令。whiletruedotouch/tmp/oldboy_$(date%F-%H-%M-%S)#在/tmp下创建文件。sleep3#休息3秒。ls-l/tmp/oldboy#查看文件创建的情况。done[rootoldboy scripts]# sh 17_4_1.sh #执行脚本后很快就会在/tmp下创建很多文件。-rw-r--r--1root root09月2213:41 /tmp/oldboy_2016-09-22-13-41-08 -rw-r--r--1root root09月2213:41 /tmp/oldboy_2016-09-22-13-41-08 -rw-r--r--1root root09月2213:41 /tmp/oldboy_2016-09-22-13-41-11 -rw-r--r--1root root09月2213:41 /tmp/oldboy_2016-09-22-13-41-08 -rw-r--r--1root root09月2213:41 /tmp/oldboy_2016-09-22-13-41-11 -rw-r--r--1root root09月2213:41 /tmp/oldboy_2016-09-22-13-41-14 ^C#按Ctrlc键后发现所有的文件都被清理了说明已经调用了find清理命令。[rootoldboy scripts]# ls -l /tmp/总用量4drwx------2oldboy oldboy40969月2213:38 ssh-YSpSS25727范例开发脚本练习使用QUIT、TSTP、INT信号。脚本如下[rootoldboy scripts]# cat 17_5.sh#! /bin/bash#Author:oldboy trainingtrapecho you art typing Ctrl-c, sorry, script will not terminate.INT#捕获Ctrlc键对应的信号后执行对应快捷键时就会执行echo命令。trapecho you art typing Ctrl-\, sorry, script will not terminate.QUIT#捕获Ctrl\键对应的信号执行对应快捷键时就会执行echo命令。trapecho you art typing Ctrl-z, sorry, script will not terminate.TSTP#捕获Ctrlz键对应的信号执行对应快捷键时就会执行echo命令实测此处没有执行echo命令。whiletruedoechoNow, test signaldatesleep5done测试执行结果如下[rootoldboy scripts]# sh 17_5.shNow,testsignal2016年 09月22日 星期四14:03:09 CST Now,testsignal2016年 09月22日 星期四14:03:14 CST ^Cyou art typing Ctrl-c, sorry, script will not terminate.#按下Ctrlc键将打印这一行提示。Now,testsignal2016年 09月22日 星期四14:03:15 CST Now,testsignal2016年 09月22日 星期四14:03:20 CST ^\退出 you art typing Ctrl-\, sorry, script will not terminate.#按下Ctrl\键将打印这一行提示。Now,testsignal2016年 09月22日 星期四14:03:21 CST Now,testsignal2016年 09月22日 星期四14:03:26 CST ^Z^Z#按下Ctrlz键没有打印提示但是程序停止运行了。范例开发企业级Shell跳板机。要求用户登录到跳板机后只能执行管理员给定的选项动作不允许以任何形式中断脚本而到跳板机服务器上执行任何系统命令。参考答案11首先做好ssh密钥验证跳板机地址为192.168.33.128​。将在所有机器上操作以下命令[rootoldboy ]# useradd jump #要在所有机器上操作。[rootoldboy ]# echo 123456|passwd --stdin jump #要在所有机器上操作。Changing passwordforuser jump. passwd: all authentication tokens updated successfully.仅在跳板机上操作以下命令[rootoldboy ]# su - jump[jumpoldboy ]$ ssh-keygen-tdsa-P-f/.ssh/id_dsa /dev/null21#生成密钥对。[jumpoldboy ]$ ssh-copy-id-i/.ssh/id_dsa.pub192.168.33.130#将公钥分发到其他服务器。The authenticity ofhost192.168.33.130 (192.168.33.130)cant be established. RSA key fingerprint is fd:2c:0b:81:b0:95:c3:33:c1:45:6a:1c:16:2f:b3:9a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 192.168.33.130 (RSA) to the list of known hosts. jump192.168.33.130s password: Now try logging into the machine, withssh 192.168.33.130, and check in: .ssh/authorized_keys tomakesure we havent added extra keys that you werent expecting.[jumpoldboy ]$ ssh-copy-id-i/.ssh/id_dsa.pub192.168.33.129#将公钥分发到其他服务器。The authenticity ofhost192.168.33.129 (192.168.33.129)cant be established. RSA key fingerprint is fd:2c:0b:81:b0:95:c3:33:c1:45:6a:1c:16:2f:b3:9a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 192.168.33.129 (RSA) to the list of known hosts. jump192.168.33.129s password: Now try logging into the machine, withssh 192.168.33.129, and check in: .ssh/authorized_keys tomakesure we havent added extra keys that you werent expecting.2实现传统的远程连接菜单的脚本。菜单脚本如下catmenu1)oldboy-192.168.33.1292)oldgirl-192.168.33.1303)exit menu3利用Linux信号防止用户中断信号在跳板机上操作。代码如下functiontrapper(){trap:INT EXIT TSTPTERMHUP#屏蔽这些信号。}4用户登录跳板机后即调用脚本不能用命令行管理跳板机​并且只能按管理员的要求选单。以下为实战内容。将脚本放在跳板机上[rootoldboy ]# echo [ $UID -ne 0 ] . /server/scripts/jump.sh /etc/profile.d/jump.sh[rootoldboy ]# cat /etc/profile.d/jump.sh[$UID-ne0]./server/scripts/jump.sh[rootoldboy scripts]# cat /server/scripts/jump.sh#! /bin/sh#oldboy trainingtrapper(){trap:INT EXIT TSTPTERMHUP#定义需要屏蔽的信号冒号表示啥都不做。}main(){while:dotrapperclearcatmenu1)Web01-192.168.33.1292)Web02-192.168.33.130 menuread-pPls input a num.:numcase$numin1)echologin in 192.168.33.129.ssh192.168.33.129;;2)echologin in 192.168.33.130.ssh192.168.33.130;;110)read-pyour birthday:charif[$char0926];thenexitsleep3fi;;)echoselect error.esacdone}main执行效果如下[rootoldboy ]# su - jump #切到普通用户即弹出菜单工作中直接用jump登录即弹出菜单。1)Web01-192.168.33.1292)Web02-192.168.33.130 Pls input a num.:1)Web01-192.168.33.1292)Web02-192.168.33.130 Pls input a num.:1#选1则进入Web01服务器。loginin192.168.33.129. Last login: Tue Oct1117:23:522016from192.168.33.128[jumplittleboy ]$#按CtrlD键退出到跳板机服务器且再次弹出菜单。1)Web01-192.168.33.1292)Web02-192.168.33.130 Pls input a num.:2#选2则进入Web02服务器。loginin192.168.33.130. Last login: Wed Oct1223:30:142016from192.168.33.128[jumpoldgirl ]$#按CtrlD键退出到跳板机服务器且再次弹出菜单。1)Web01-192.168.33.1292)Web02-192.168.33.130 Pls input a num.:110#选110则进入跳板机命令提示符your birthday:0926#需要输入特别码才能进入这里是管理员通道密码要保密呦。[rootoldboy scripts]# #跳板机管理命令行。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价