每天一個 Linux 命令:trap 命令

1. 命令簡介

trap 命令是 Shell 內建命令,用於指定在接收到信號後將要採取的動作。常見的用途是在腳本程序被中斷時完成清理工作。

2. 命令格式

trap [-lp] [ARG] [SIGSPECS]

3. 選項說明

-l
 列出信號名稱與對應的數值
-p
 列出信號與其綁定的命令列表
ARG
 與指定信號綁定的命令。如果 ARG 爲空字符串,表示忽略信號;如果 ARG 不指定(缺省)或爲 -,表示執行信號的默認動作
SIGSPECS
 信號列表,可以是信號名稱,也可以是信號對應的數值。可用信號可以使用 trap -l 查看

4. 常用示例

(1)忽略 HUP、INT、QUIT、TSTP 信號。

trap "" HUP INT QUIT TSTP

(2)捕獲 HUP、INT、QUIT、TSTP 信號,並執行默認動作。

trap HUP INT QUIT TSTP
#或
trap - HUP INT QUIT TSTP

(3)掛載 Shell 進程結束前需要執行的命令。格式爲:trap “commands” EXIT。如腳本 exit.sh:

#!/bin/bash

echo "start"
trap "echo 'end'" EXIT
echo "before exit"
exit 0

執行 exit.sh 輸出:

start
before exit
end

5. 信號簡介

信號是一種進程間通信機制,它給應用程序提供一種異步的軟件中斷,使應用程序有機會接受其他程序發送的命令(即信號)。應用程序收到信號後,有三種處理方式:忽略、默認或捕捉。進程收到一個信號後,會檢查對該信號的處理機制。如果是 SIG_IGN,就忽略該信號;如果是 SIG_DFT,則會採用系統默認的處理動作,通常是終止進程或忽略該信號;如果給該信號指定了一個處理函數,則會中斷當前進程正在執行的任務,轉而去執行該信號的處理函數,返回後再繼續執行被中斷的任務。

在有些情況下,我們不希望自己的 Shell 腳本在運行時被中斷,比如說我們寫的 Shell 腳本設爲某一用戶登錄系統後默認執行的 Shell 腳本,使這一用戶進入系統後只能做某一項工作,如數據庫備份, 我們不希望用戶使用 Ctrl+C 發送 SIGINT 信號來中斷當前 Shell 腳本的執行,進入到 Shell 交互模式,做我們不希望做的事情。這便用到了信號處理。

以下是一些你可能會遇到的,要在程序中使用的常見的信號:

詳細的信號列表,可以使用命令trap \-lkill \-l查看,也可以查看頭文件 <signal.h>。例如,執行trap \-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

參考文獻

[1] trap manual

[2] Linux 命令大全. trap 命令

[3] linux 中的 trap 命令

轉自:戀貓大鯉魚

https://dablelv.blog.csdn.net/article/details/86717160

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/dQi0g6-oNuuPdVqjwv_rYw