简介

  • 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. 设置捕获信号的动作:
    1
    
    trap "命令" 信号
    

    例如,以下命令设置在收到 SIGINT 信号时执行 echo "Caught interrupt signal"

    1
    
    trap "echo 'Caught interrupt signal'" SIGINT
    
  2. 禁用信号的默认行为:
    1
    
    trap "" 信号
    

    例如,以下命令禁用 SIGINT 信号的默认行为:

    1
    
    trap "" SIGINT
    
  3. 恢复信号的默认行为:
    1
    
    trap - 信号
    

    例如,以下命令恢复 SIGINT 信号的默认行为:

    1
    
    trap - SIGINT
    
  4. 捕获多个信号:
    1
    
    trap "命令" 信号1 信号2 ...
    

    例如,以下命令设置在收到 SIGINTSIGTERM 信号时执行 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. 捕获并忽略信号:
    1
    
    trap "" 信号
    

    通过将空字符串指定为命令,可以捕获并忽略特定信号的默认动作。例如,以下命令会忽略 SIGTERM 信号:

    1
    
    trap "" SIGTERM
    
  2. 处理脚本终止信号:
    1
    
    trap "cleanup_function" EXIT
    

    在脚本退出时执行清理函数。EXIT 是一个特殊的信号,表示脚本即将退出。例如,以下命令会在脚本退出时调用名为 cleanup 的清理函数:

    1
    2
    3
    4
    5
    6
    7
    8
    
    trap "cleanup" EXIT
    
    cleanup() {
        echo "Performing cleanup..."
        # 其他清理操作
    }
    
    # 脚本的主要逻辑
    
  3. 防止脚本被中断:
    1
    
    trap "echo 'Script is running. Please wait...'" SIGINT
    

    通过捕获 SIGINT 信号(Ctrl+C)并输出一条消息,可以防止用户中断正在执行的脚本。这样,用户按下 Ctrl+C 时,只会得到一条消息而不是立即中断脚本。

  4. 设置错误处理:
    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
    }
    
    # 脚本的主要逻辑
    
  5. 临时捕获信号:
    1
    
    trap "cleanup_function" SIGNAL
    

    可以在脚本的特定部分设置 trap,然后在执行完该部分后恢复原有的信号处理。例如,以下命令会在执行某个任务期间捕获 SIGINT 信号,执行清理操作,然后在任务完成后恢复默认的信号处理:

    1
    2
    3
    4
    5
    6
    
    trap "cleanup_function" SIGINT
    
    # 执行某个任务
    
    # 恢复默认的信号处理
    trap - SIGINT
    

这些技巧可以帮助你更好地处理脚本中的信号,确保在发生特定事件时执行适当的操作。