信號處理

Bash Shell

喺默認情況下,Bash Shell 會忽略 SIGQUIT(3)SIGTERM(15) 信號, 所以執行下面嘅命令唔會有任何反應($$ 係當前 Shell 嘅進程 ID)。

kill -3 $$
kill -15 $$

如果收到 SIGHUP(1) 信號,Bash Shell 會退出,但喺退出之前, 佢會把 SIGHUP 信號傳畀所有由該 Shell 啟動嘅進程同腳本。

kill -1 $$

TRAP

可以用 trap 命令捕捉信號。

trap commands signals

捕捉信號

鍵盤 Ctrl+C 嘅信號係 SIGINT

#!/usr/bin/env bash

trap "echo ' Trapped Ctrl-C'" SIGINT

count=1
while [ $count -le 5 ]
do
    echo "loop #$count"
    sleep 1
    count=$[ $count + 1 ]
done
loop #1
loop #2
^C Trapped Ctrl-C
loop #3
loop #4
^C Trapped Ctrl-C
loop #5

退出信號

可以捕捉腳本退出時候嘅信號。

trap "echo ' Trapped Ctrl-C'" EXIT

移除信號

-- 就可以移除信號。

trap -- SIGINT

NOHUP

No Hang Up,由該命令啟動嘅進程或者腳本會忽略 SIGHUP 信號。 即係話,即使終端退出,由該終端啟動嘅進程或者腳本唔會跟住一齊退出。

run a command immune to hangups, with output to a non-tty
nohup ./foo

默認會把 STDOUTSTDERR 重定向到 nohup.out

-rw------- 1 kuga kuga   40 Sep  2 18:46 nohup.out

自己重定向會好啲。

nohup ./foo > out.log 2>&1
-rw-rw-r-- 1 kuga kuga   62 Sep  2 18:50 out.log

Nice Value

控制進程優先級嘅參數。nice 值越高,進程嘅優先級越低,分配到嘅 CPU 資源越少。

範圍

nice 值嘅範圍從 -2019

  • -20:最高優先級。
  • 0:默認優先級。
  • 19:最低優先級。

啟動進程優先級

nice -n VALUE command
nice -n 10 ./foo

修改進程優先級

renice VALUE -p PID
renice 5 -p 404

權限

  • 普通用戶只能降低進程嘅優先級。
  • root 用戶先可以提高進程嘅優先級。