[toc]
信號介紹
運行Shell腳本時,如果按下快捷鍵Ctrl+c
或Ctrl+x
(x為其他字符),程序就會終止運行,
在有些情況下,我們並不希望Shell腳本在運行時被信號中斷,此時就可以使用屏蔽信號手段,讓程序忽略用戶輸入的信號指令,從而繼續運行Shell腳本程序,
簡單的說,Linux的信號是由一個整數構成的異步消息,它可以由某個進程發給其他的進程,也可以在用戶按下特定鍵發生某種異常事件時,由系統發給某個進程。
信號列表
在Linux下和洗好相關的常見命令為kill
和trap
命令,執行kill -l
或trap -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.
>>