shell脚本学习总结12--系统信号
信号是Linux系统中一种进程通信机制。我们可以使用特定的信号来中断进程。每一种信号都同一个整数值相关联。
kill命令可用来想进程发送信号,而trap命令用来处理所接收的信号。
kill
列出所有可用的信号
[root@LAMP ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
经常用到的只有几个
SIGHUP 1 —— 对控制进程或终端终结进行挂起检测。
SIGINT 2 —— Ctrl+C时发送该信号
SIGKILL 9 —— 强杀进程
SIGTERM 15 —— 默认终止进程
SIGTSTP 20 —— Ctrl+Z时发送该信号
用法,例如强杀httpd进程19421
[root@LAMP ~]# kill -s SIGKILL 19421 [root@LAMP ~]# kill -9 19421
trap
一旦trap将某个函数分配一个信号,当脚本运行收到相应的信号,就会执行相应的函数
实例1:
[root@localhost sbin]# vim demo_trap.sh #/bin/bash function hander(){ echo Hey,received signal : SIGINT } echo My process ID is $$ trap 'hander' SIGINT while true;do sleep 1 done
Ps:死循环的作用是使进程一直处于活动状态。
执行,并按Ctrl+C
[root@localhost sbin]# sh demo_trap.sh My process ID is 11756 ^CHey,received signal : SIGINT
实例2,生产环境用作于跳板机,使普通操作用户连接只能操作脚本
[root@LAMP profile.d]# pwd /etc/profile.d [root@LAMP profile.d]# vim tiaoban.sh
function trapper(){
trap ':' INT EXIT TSTP TERM HUP
}
if [ $UID -ne 0 ];then
while true;do
trapper
clear
echo [1] WEB Server
echo "" echo [2] APP Server echo "" echo [3] DB Server echo "" echo [x] Exit echo "" read -p "Option: " nu case $nu in 1) ssh redhat@192.168.1.20 ;; 2) ssh appadmin@192.168.1.30 ;; 3) ssh oracle@192.168.1.40 ;; x) exit ;; *) echo "USAGE:[123x]" read -p "Press any key to continue." esac done fi
当用普通用户登陆时,直接执行脚本,并按ctrl+c等命令都无法进入命令行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了