简介
- trap命令
trap 信号
1.1 简单使用
-
trap命令,用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。
- 历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用
#include
命令包含进来的signal.h
头文件中,在使用信号名时需要省略SIG
前缀 -
kill和trap等都可以看到信号编号及其关联的名称。“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。
- 查看所有信号的:
trap -l
1.2 trap的使用
- trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。
trap command signal
linux trap命令 详解
trap
命令在 Linux 和其他类 Unix 操作系统中用于捕获和处理信号。信号是一种在 Unix 系统中用于通知进程发生了某个事件的机制。trap
命令允许你为脚本或命令设置对信号的处理方式。
语法:
1
trap [命令] [信号]
常见用法:
- 设置捕获信号的动作:
1
trap "命令" 信号
例如,以下命令设置在收到
SIGINT
信号时执行echo "Caught interrupt signal"
:1
trap "echo 'Caught interrupt signal'" SIGINT
- 禁用信号的默认行为:
1
trap "" 信号
例如,以下命令禁用
SIGINT
信号的默认行为:1
trap "" SIGINT
- 恢复信号的默认行为:
1
trap - 信号
例如,以下命令恢复
SIGINT
信号的默认行为:1
trap - SIGINT
- 捕获多个信号:
1
trap "命令" 信号1 信号2 ...
例如,以下命令设置在收到
SIGINT
或SIGTERM
信号时执行echo "Caught interrupt or termination signal"
:1
trap "echo 'Caught interrupt or termination signal'" SIGINT SIGTERM
示例:
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# 设置捕获 Ctrl+C 信号
trap "echo 'Caught interrupt signal'" SIGINT
echo "Running script..."
# 模拟一个长时间运行的任务
sleep 10
echo "Script completed."
在上述脚本中,当用户按下 Ctrl+C
时,trap
命令将捕获 SIGINT
信号并执行指定的命令,这里是输出 “Caught interrupt signal”。
trap
命令通常用于确保在脚本执行期间捕获特定信号时执行某些操作,例如清理资源或执行特定的处理程序。
linux trap命令 常用技巧
trap
命令在脚本编写中可以用于处理信号,以下是一些 trap
命令的常用技巧:
- 捕获并忽略信号:
1
trap "" 信号
通过将空字符串指定为命令,可以捕获并忽略特定信号的默认动作。例如,以下命令会忽略
SIGTERM
信号:1
trap "" SIGTERM
- 处理脚本终止信号:
1
trap "cleanup_function" EXIT
在脚本退出时执行清理函数。
EXIT
是一个特殊的信号,表示脚本即将退出。例如,以下命令会在脚本退出时调用名为cleanup
的清理函数:1 2 3 4 5 6 7 8
trap "cleanup" EXIT cleanup() { echo "Performing cleanup..." # 其他清理操作 } # 脚本的主要逻辑
- 防止脚本被中断:
1
trap "echo 'Script is running. Please wait...'" SIGINT
通过捕获
SIGINT
信号(Ctrl+C)并输出一条消息,可以防止用户中断正在执行的脚本。这样,用户按下 Ctrl+C 时,只会得到一条消息而不是立即中断脚本。 - 设置错误处理:
1
trap "error_handler" ERR
在脚本中设置一个错误处理函数,以便在命令发生错误时执行特定的操作。例如,以下命令会在发生错误时调用名为
handle_error
的错误处理函数:1 2 3 4 5 6 7 8
trap "handle_error" ERR handle_error() { echo "An error occurred. Exiting..." exit 1 } # 脚本的主要逻辑
- 临时捕获信号:
1
trap "cleanup_function" SIGNAL
可以在脚本的特定部分设置
trap
,然后在执行完该部分后恢复原有的信号处理。例如,以下命令会在执行某个任务期间捕获SIGINT
信号,执行清理操作,然后在任务完成后恢复默认的信号处理:1 2 3 4 5 6
trap "cleanup_function" SIGINT # 执行某个任务 # 恢复默认的信号处理 trap - SIGINT
这些技巧可以帮助你更好地处理脚本中的信号,确保在发生特定事件时执行适当的操作。