linux trap

burlingame發表於2024-06-25

轉載:Linux訊號和trap命令的使用 - 劉合棟 - 部落格園 (cnblogs.com)

Fork me on GitHub

Linux訊號和trap命令的使用

目錄
  • 訊號介紹
  • 訊號列表
  • 控制訊號
    • Ctrl+c顯示指定內容
    • 使Ctrl+c無任何操作
    • 處理多個訊號
    • 處理所有訊號
    • 恢復訊號
  • 實現跳板機(例項)



訊號介紹

執行Shell指令碼時,如果按下快捷鍵Ctrl+cCtrl+x(x為其他字元),程式就會終止執行,

在有些情況下,我們並不希望Shell指令碼在執行時被訊號中斷,此時就可以使用遮蔽訊號手段,讓程式忽略使用者輸入的訊號指令,從而繼續執行Shell指令碼程式,

簡單的說,Linux的訊號是由一個整數構成的非同步訊息,它可以由某個程序發給其他的程序,也可以在使用者按下特定鍵發生某種異常事件時,由系統發給某個程序。






訊號列表

在Linux下和洗好相關的常見命令為killtrap命令,執行kill -ltrap -l命令,可以列出系統支援的各種洗好,多大64個。

[root@www ~]$ 
[root@www ~]$ 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
1) 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	

[root@www ~]$




下列表示Linux系統中重要的訊號

訊號說明
HUP(1) 掛起,通常因終端掉線或使用者退出而引發
INT(2) 中斷,通常因按下 Ctrl+c 組合件而引發
QUIT(3) 退出。通常因按下 Ctrl+\ 組合鍵而引發
ABRT(6) 中止,通常因某些嚴重的執行錯誤而引發
ALRM(14) 報警,通常用來處理超時
TERM(15) 終止,通常在系統關機時傳送
TSTP(20) 停止程序的執行,但該訊號可以被處理和忽略,通常因按下 Ctrl+z 組合鍵而引發






控制訊號

trap 命令用於指定在接受到訊號後將要採取的行動,訊號的相關說明前面已經提到過,trap 命令的一種常見用途是在指令碼程式被終端時完成清理工作,或者遮蔽使用者非法使用的某些訊號,在使用訊號名時需要省略 SIG 字首,可以在命令提示符下輸入命令trap -l來檢視訊號的編號及其關聯的名稱。

trap 命令的引數分為兩部分,前一部分是接收到指定訊號時要採取的行動,後一部分是要處理的訊號名。

trap命令的使用語法如下:

trap command signal

signal是指接收到的訊號,command是指接收到該訊號應採取的行動,也就是:

trap '命令;命令' 訊號編號

或者

trap '命令;命令' 訊號名



Ctrl+c顯示指定內容

[root@www ~]$ trap 'echo "<Ctrl+c> Failure."' 2
[root@www ~]$ ^C<Ctrl+c> Failure.

[root@www ~]$ ^C<Ctrl+c> Failure.

[root@www ~]$ 

可以使用stty -a列出中斷訊號與鍵盤的對應資訊,如下:

[root@www ~]$ stty -a
speed 38400 baud; rows 31; columns 95; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
-imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[root@www ~]# 



使Ctrl+c無任何操作

[root@www ~]$ trap "" 2     # 之後使用Ctrl+c快捷鍵將無任何操作



處理多個訊號

[root@www ~]$ trap '' 1 2 3 20 15



處理所有訊號

[root@www ~]$ trap ':' `echo {1..64}`



恢復訊號

trap ':' 1 2 3 20 15        # 該命令即可恢復指定訊號






實現跳板機(例項)

四臺機器:

192.168.100.100 - 客戶機

192.168.100.101 - 跳板機

192.168.100.102 - Web伺服器

192.168.100.151 - Sql伺服器


(1) 建立Jump使用者(跳板機)

[root@www ~]$ useradd Jump ; echo 123123 | passwd Jump --stdin

(2) Jump釋出公鑰(跳板機)

[Jump@www ~]$ ssh-keygen        # 回車即可
[Jump@www ~]$ ssh-copy-id 192.168.100.102   # yes後輸入密碼
[Jump@www ~]$ ssh-copy-id 192.168.100.151   # yes後輸入密碼

(3) 編寫指令碼(跳板機)

#! /bin/bash
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#   Copyright (C) 2019 All rights reserved.
#
#   FileName      :jump.sh
#   Author        :Oliven
#   Email         :liuhedong135@163.com
#   Date          :2019-02-12
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


trap 'clear;echo "Not allowed Operation !!!"' 1 2 3 15 20       # "修改訊號控制"

function Echo_Choice(){         # 連線後列印的選擇條目
	echo "
	>[ Welcome to use the jump mechine ]<

	(1)  Conneciton to the Web Server.
	(2)  Connection to the Sql Server.
	(3)  Conneciton to the Jump Server.
	(4)  Exit.
"
}

function Wait_Info(){           # 連線時列印的顯示資訊
	clear
	echo -n "Please wait a moment, Connecting ."
	sleep 1
	echo -n "."
	sleep 1
	echo -n "."
	sleep 1
	clear
	echo "The Connection is Successfully."
	sleep 1
}

while true                          # 開始迴圈
do                          
	clear                           # 首先清個屏
	Echo_Choice                     # 然後選擇條目
    read -p ">> " choice            # 獲取使用者的操作
    case "$choice" in               # case語句進行匹配
    1)
    	Wait_Info                   # 連線時列印的顯示資訊
    	ssh root@192.168.100.102    # 連線到Web伺服器
    ;;
    2)
    	Wait_Info                   # 連線時列印的顯示資訊
    	ssh root@192.168.100.151    # 連線到Sql伺服器
    ;;
    3)
	    Wait_Info                   # 連線時列印的顯示資訊
    	read -p "Enter The Admin Key: " key     # 等待使用者輸入跳板機的key
		if [ "$key" = "199907" ]                # 如果key等於199907
		then                                    #         ↓
			clear                               # 首先清個屏,然後直接連線成功
			break                               # 退出該指令碼,進入Jump機
		else
		    echo "The key is invalid."          # 如果key不對,列印錯誤資訊
		    sleep 1                             # 先等待一秒
		    continue                            # 然後回到開頭的while,重新選擇條目
		fi
    ;;
    4)                  
    	exit 0                      # 退出該跳板機
    ;;
    *)
    	echo "Invalid options."     # 如果選擇不為1、2、3、4,即列印的錯誤資訊
	sleep 0.5                       # 然後等待0.5s後,回到開頭的while繼續迴圈
    esac
done

(4) 加入配置檔案

[root@www ~]$ echo "source /home/Jump/jump.sh" >> /home/Jump/.bash_profile

(5) 測試(客戶機)

[root@www ~]$ ssh Jump@192.168.100.101
Jump@192.168.100.101's password: 
# 輸入完密碼123123之後,出現以下內容即可成功

	>[ Welcome to use the jump mechine ]<

	(1)  Connection to the Web Server.
	(2)  Connection to the Sql Server.
	(3)  Connection to the Jump Server.
	(4)  Exit.

>> 

相關文章