信号处理
Bash Shell
在默认情况下,Bash Shell 会忽略 SIGQUIT(3)
和 SIGTERM(15)
信号, 因此执行下面的命令不会有任何反应($$
是当前 Shell 的进程 ID)。
bash
kill -3 $$
bash
kill -15 $$
如果收到 SIGHUP(1)
信号,Bash Shell 会退出,但在退出前, 它会把 SIGHUP
信号传给所有由该 Shell 启动的进程和脚本。
bash
kill -1 $$
TRAP
可以使用 trap
命令捕获信号。
bash
trap commands signals
捕获信号
键盘 Ctrl+C
的信号是 SIGINT
。
bash
#!/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
txt
loop #1
loop #2
^C Trapped Ctrl-C
loop #3
loop #4
^C Trapped Ctrl-C
loop #5
退出信号
可以捕获脚本退出时候的信号。
bash
trap "echo ' Trapped Ctrl-C'" EXIT
移除信号
使用 --
即可移除信号。
bash
trap -- SIGINT
NOHUP
No Hand Up,由该命令启动的进程或脚本会忽略 SIGHUB 信号。 也就是说,即使终端退出,由该终端启动的进程或脚本不会跟着一起退出。
txt
run a command immune to hangups, with output to a non-tty
bash
nohup ./foo
默认会把 STDOUT
和 STDERR
重定向到 nohup.out
。
bash
-rw------- 1 kuga kuga 40 Sep 2 18:46 nohup.out
自己重定向会更好一些。
bash
nohup ./foo > out.log 2>&1
bash
-rw-rw-r-- 1 kuga kuga 62 Sep 2 18:50 out.log
Nice Value
控制进程优先级的参数。nice
值越高,进程的优先级越低,分配到的 CPU 资源越少。
范围
nice
值的范围从 -20
到 19
:
-20
:最高优先级。0
:默认优先级。19
:最低优先级。
启动进程优先级
bash
nice -n VALUE command
bash
nice -n 10 ./foo
修改进程优先级
bash
renice VALUE -p PID
bash
renice 5 -p 404
权限
- 普通用户只能降低进程的优先级。
- root 用户才能提高进程的优先级。