16.1 处理信号
16.1.1 重温 Linux 信号
常见 Linux 系统信号:
- 默认情况下, 脚本会忽略3, 5信号, 而处理1, 2信号 (应该需要自己处理)
16.1.2 生成信号
1. 中断进程
- Ctrl+C: 生成 sigint 信号
2. 暂停进程
- Ctrl+Z: 生成 sigtstp 信号
16.1.3 捕获信号
trap 命令
格式:
trap commands signals
使用:
#!/bin/bash
# Testing signal trapping
#
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
#
echo This is a test script
#
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
echo "This is the end of the test script"
#
16.1.4 捕获脚本退出
- EXIT
#!/bin/bash
# Trapping the script exit
#
trap "echo Goodbye..." EXIT
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
16.1.5 修改或移除捕获
修改:
#!/bin/bash
# Modifying a set trap
#
trap "echo ' Sorry... Ctrl-C is trapped.'" SIGINT
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
trap "echo ' I modified the trap!'" SIGINT
#
count=1
while [ $count -le 5 ]
do
echo "Second Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
移除:
trap -- sig
,-
也行
#!/bin/bash
# Removing a set trap
#
trap "echo ' Sorry... Ctrl-C is trapped.'" SIGINT
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
# Remove the trap
trap -- SIGINT
echo "I just removed the trap"
#
count=1
while [ $count -le 5 ]
do
echo "Second Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
16.2 以后台模式运行脚本
16.2.1 后台运行脚本
- 在命令最后使用
&
- 进入后台后, 脚本仍会使用当前终端作为 stdout, stderr
- 如果启动该脚本的终端退出, 那些脚本也会退出
#!/bin/bash
# Test running in the background
#
count=1
while [ $count -le 10 ]
do
sleep 1
count=$[ $count + 1 ]
done
#
$
$ ./test4.sh &
[1] 3231
$
16.2.2 运行多个后台作业
16.3 在非控制台下运行脚本
nohup 命令运行了另外一个命令来阻断所有发送给该进程的 SIGHUP 信号。这会在退出终端会话时阻止进程退出。
$ nohup ./test1.sh &
- 会将输出重定向到 nohup.out 中
16.4 作业控制
- 启动
- 停止
- 终止
- 恢复
16.4.1 查看作业
jobs:
-l
: 查看 pid
$ jobs
+
: 默认作业, 未指定作业号时使用该作业, 只有一个-
: 下一个默认作业, 只有一个
参数:
16.4.2 重启停止的作业
以后台模式重启作业:
bg 命令:
$ bg
以前台模式重启作业:
fg 命令:
$ fg
16.5 调整谦让度
优先级:
- -20~+19 (高->低)
- bash shell 启动的进程优先级为0
16.5.1 nice 命令
$ nice -n 10 ./test4.sh > test4.out &
nice 命令阻止普通用户提高优先级
简写:
$ nice -10 ./test4.sh > test4.out &
16.5.2 renice 命令
$ renice -n 10 -p 5055
限制:
- 只能调整当前用户的进程
- 只能降低进程优先级
- root 用户随意
16.6 定时运行作业
16.6.3 使用新 shell 启动脚本
加载配置文件的优先级:
- $HOME/.bash_profile
- $HOME/.bash_login
- $HOM#/.profile