trap用法

文章介绍了Linuxshell脚本中如何使用trap命令捕获并处理信号,如INT(Ctrl+C)和HUP(挂断),以及如何通过trap防止中断脚本执行。同时,讨论了Ctrl+C、Ctrl+Z、Ctrl+D等控制键的作用,如暂停和终止进程。此外,还展示了如何阻止默认的控制键行为。

trap "" IN


例子:
  trap "" INT
while :
do
        read -p "xxxx:" c
        case $c in
                e)
                        break 
        esac
done


屏蔽断开连接
trap "" HUP
加了这个参数,即使ssh断开,脚本依然再跑

kill -19  停止程序,但是不终止程序,类似ctrl+z  SIGSTOP

kill -18  启动程序在后台运行  SIGCONT
kill -20  也是停止程序 SIGTSTP

trap " echo '#####do not use ctrl+z ### '" TSTP
while :
do
        #read -p "xxxx:" c
        echo "1111111"
        sleep 1
        case $c in
                e)
                        break 
        esac
done

触发时 ctrl+c 也失效了 只能kill -9 杀掉


Ctrl-c Kill foreground process  终止前台进程
Ctrl-z Suspend foreground process  挂起前台进程

Ctrl-d Terminate input, or exit shell

没有任何字符串的时候
相当于logout

如果有input 输入的话退出


Ctrl-s Suspend output

任何键盘操作屏幕都不显示


Ctrl-q Resume output

恢复之前键盘上的操作

Ctrl-o Discard output

没有任何字符的时候等价与回车


Ctrl-l Clear screen

trap " echo '####do not use ctrl +c#### '" INT
while :
do
        read -p "xxxx:" c
        case $c in
                e)
                        break
        esac
done


xxxx:^C####do not use ctrl +c#### 
^C####do not use ctrl +c#### 
^C####do not use ctrl +c#### 


trap " echo '#####do not use ctrl+z ### '" TSTP
while :
do
        read -p "xxxx:" c
        #echo "1111111"
        sleep 1
        case $c in
                e)
                        break 
        esac
done


[root@rel7 ~]# sh 7.sh
xxxx:dwwd
xxxx:^Z#####do not use ctrl+z ### 
^C


 

trap 命令有三种形式,分别对应三种不同的信号回应方式: 1. `trap "commands" signal-list`:当脚本收到 `signal-list` 清单内列出的信号时,trap 命令执行双引号中的命令[^3]。 2. `trap signal-list`:trap 不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行[^3]。 3. `trap "" signal-list`:trap 命令指定一个空命令串,允许忽视信号[^3]。 常见信号及其默认动作和说明如下: | 名称 | 默认动作 | 说明 | | ---- | ---- | ---- | | SIGHUP | 终止进程 | 终端线路挂断 | | SIGINT | 终止进程 | 中断进程 (Ctrl - C) | | SIGQUIT | 建立 CORE 文件 | 终止进程,并且生成 core 文件 (Ctrl - \) | | SIGILL | 建立 CORE 文件 | 非法指令 | | SIGTRAP | 建立 CORE 文件 | 跟踪自陷 | | SIGBUS | 建立 CORE 文件 | 总线错误 | | SIGSEGV | 建立 CORE 文件 | 段非法错误 | | SIGFPE | 建立 CORE 文件 | 浮点异常 | | SIGIOT | 建立 CORE 文件 | 执行 I/O 自陷 | | SIGKILL | 终止进程 | 杀死进程 | | SIGPIPE | 终止进程 | 向一个没有读进程的管道写数据 | | SIGALARM | 终止进程 | 计时器到时 | | SIGTERM | 终止进程 | 软件终止信号 | | SIGSTOP | 停止进程 | 非终端来的停止信号 | | SIGTSTP | 停止进程 | 终端来的停止信号 (Ctrl - Z) | | SIGCONT | 忽略信号 | 继续执行一个停止的进程 | | SIGURG | 忽略信号 | I/O 紧急信号 | | SIGIO | 忽略信号 | 描述符上可以进行 I/O | | SIGCHLD | 忽略信号 | 当子进程停止或退出时通知父进程 | | SIGTTOU | 停止进程 | 后台进程写终端 | | SIGTTIN | 停止进程 | 后台进程读终端 | | SIGXGPU | 终止进程 | CPU 时限超时 | | SIGXFSZ | 终止进程 | 文件长度过长 | | SIGWINCH | 忽略信号 | 窗口大小发生变化 | | SIGPROF | 终止进程 | 统计分布图用计时器到时 | | SIGUSR1 | 终止进程 | 用户定义信号 1 | | SIGUSR2 | 终止进程 | 用户定义信号 2 | | SIGVTALRM | 终止进程 | 虚拟计时器到时 | 例如,以下是一个简单的 trap 使用示例: ```bash #!/bin/bash # 定义一个函数 function cleanup { echo "Cleaning up and exiting..." exit } # 当接收到 SIGINT 信号(Ctrl - C)时,执行 cleanup 函数 trap cleanup SIGINT # 模拟一个长时间运行的任务 while true; do sleep 1 done ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值