Linux Bash终端中Trap信号的相关技术咨询
Linux Bash终端中Trap信号的相关技术咨询
一、什么是捕获信号(Trap a Signal)?
简单来说,在Bash脚本里捕获信号,就是告诉系统:“当这个特定信号触发时,别执行它默认的行为,要么听我的执行指定操作,要么直接忽略它”。比如默认按下Ctrl+C会发送SIGINT(信号2)终止脚本,但如果我们捕获这个信号,就能让脚本无视这个操作,或者先执行完清理日志、关闭资源的代码再退出。
二、如何在Bash中通过名称或ID捕获信号?
Bash的trap命令就是干这个的,用法很灵活:
- 用信号ID捕获:比如要捕获信号2(对应
Ctrl+C的SIGINT),可以写trap 'echo "别按Ctrl+C呀!"' 2 - 用信号名称捕获:同样的信号,也可以写
trap 'echo "别按Ctrl+C呀!"' SIGINT - 如果要忽略某个信号,就把操作部分写成空字符串,比如
trap '' 2或者trap '' SIGINT
这里要提个关键知识点:信号9(SIGKILL)是系统级强制终止信号,根本无法被捕获或忽略,不管脚本里怎么写,收到这个信号进程都会直接被干掉。
三、修改你的脚本以捕获指定信号(比如9、20等)
结合你的需求,先修正脚本里无效的信号9,再调整捕获逻辑,给你加了注释方便理解:
#!/bin/bash # 注意:信号9(SIGKILL)无法被捕获/忽略,所以这里不写它 # 下面命令表示忽略这些信号: # 2(SIGINT/Ctrl+C)、3(SIGQUIT/Ctrl+\)、18(SIGCONT/恢复挂起进程)、20(SIGTSTP/Ctrl+Z) trap '' 2 3 18 20 # 关闭终端回显(输入内容不会显示在屏幕上,适合输入密钥场景) stty -echo # 第一次输入密钥 read -p "Key: " key_1 echo # 第二次输入密钥确认 read -p "Again: " key_2 echo key_3= # 校验两次输入是否一致 if [ "$key_1" = "$key_2" ]; then # 清屏 tput clear # 循环等待输入正确密钥才允许退出 until [ "$key_3" = "$key_2" ]; do read key_3 done else # 将错误信息输出到标准错误流 echo "locktty: keys do not match" 1>&2 fi # 恢复终端回显 stty echo
如果你的需求不是忽略信号,而是捕获后执行自定义操作(比如收到信号20时给用户提示),可以把trap行改成这样:
# 捕获信号20(SIGTSTP),触发自定义提示 trap 'echo "抱歉,这个脚本不能被挂起!"' 20
备注:内容来源于stack exchange,提问作者Humza Config
相关产品推荐
相关产品推荐

