Linux 是通過信号來實現進程間通信的,所以我們編寫腳本時,可以通過捕捉特定的信号來控制Shell腳本的操作。下面簡單列舉一下常見的Linux 信号
生成信号
Linux 允許用鍵盤組合鍵生成兩種基本的Linux信号,
1.中斷(terminating)進程
Ctrl C 生成SIGINT 信号,并發送給當前 Shell 中運行的所有進程。這是我們強行終止Shell 進程常用的方法。
2.暫停(stopping)進程
Ctrl Z 生成SIGTSTP 信号,并發送給當前Shell 中運行的所有進程。
捕獲信号
腳本可以通過 ' trap '命令來捕獲信号,命令格式為:
trap commands signal1 signal2...
從上圖上可以看出,通過 trap 捕獲了SIGINT 信号,并在捕獲是打印消息。
輸出結果為:
從輸出結果看出,我在第5秒和第8秒後,通過組合鍵 Ctrl C,觸發了 SIGINT 信号。
EXIT 信号
EXIT 信号在腳本退出時生成,也可以在腳本中通過 trap 來捕獲。
删除信息捕獲
捕獲某個信号并執行邏輯後,希望解除信号捕獲,trap 命令也提供了方法
trap -- signals #删除signal 的信号捕獲。
後台模式運行腳本
我們在終端啟動腳本,但有時腳本運行時間比較久,那麼終端就無法處理其他交互,這種情況時,我們可以讓腳本在後台運行,終端可以立即返回進行其他交互。
以後台模式運行腳本非常簡單,隻要在腳本啟動命令後面加上 '&' 符号即可。例如:
./my_script &
非控制台下運行腳本
有時我們需要後台運行的腳本在終端退出後仍然執行,那麼就需要一個命令 'nohup'。
nohup ./my_script.sh &
通過該命令啟動腳本後,當終端發過來SIGHUP信号時,腳本會忽略該信号。因為nohup 會将腳本進程與終端解除關聯,所以腳本進程也就不再和STDOUT & STDERR關聯了,nohup會将腳本的STDOUT&STDERR 重定向到nohup.out文件中。
重啟停止的Job
上面我們講過,通過Ctrl Z可以停止運行的腳本任務,停止後我們可以選擇kill掉,如果我們希望停止的任務繼續進行,如何操作呢?通過 ‘bg’命令可以重啟停止的任務。格式為
bg (job_id) #重啟對應job_id的job
從上圖看出,我在腳本 "t16.1"中做了循環處理,當運行到第2次循環時,我停止了腳本,通過 jobs命令查看到腳本處于停止狀态,通過 bg 命令,重啟Job, 腳本繼續執行。此處 bg 沒有填寫 job id, 那麼命令會重啟默認job, 默認 Job 會在 job id 旁邊标識 “ ”,此例中隻包含一個默認job,所有隻需要輸入 bg 命令即可。
調整腳本運行優先級
Linux内核負責将CPU時間按照優先級分配給不同的進程,Linux中優先級從-20(最高優先級)到 19(最低優先級),默認以0 啟動所有進程。通過 nice 命令可以調整優先級,格式為
nice -n pri_level ./my_script # pri_level為優先級級别
上圖中以優先級為11啟動dash 進程,可以看到,NI 列中 dash 優先級為11。
renice 命令: 調整已運行命令的優先級。格式為
renice -n pri_level -p PID #修改進程PID的優先級。
Schedule Job
at 命令可以指定Linux 何時運行腳本。格式為
at [-f filename] time
at 命令會将Job保存到/var/spool/at 中,at的守護進程 atd 會定時去文件中讀取schedule job,并按照計劃時間執行,從而實現linux 上的 Schedule Job。at 命令支持的時間格式比較豐富,主要包括;
查看所有計劃任務命令:‘apt‘., 删除 schedule job:: at rm line_num, 舉例:
cron 時間表
cron 是一種特殊的時間表示格式:
min hour dayofmonth month dayofweek command
cron 可以用來實現定時計劃。舉例cron:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!