信号处理

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 Hand Up,由该命令启动的进程或脚本会忽略 SIGHUB 信号。 也就是说,即使终端退出,由该终端启动的进程或脚本不会跟着一起退出。

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 用户才能提高进程的优先级。