16.1 处理信号

16.1.1 重温 Linux 信号

常见 Linux 系统信号:

image.png
image.png

  • 默认情况下, 脚本会忽略3, 5信号, 而处理1, 2信号 (应该需要自己处理)

16.1.2 生成信号

1. 中断进程

  • Ctrl+C: 生成 sigint 信号

2. 暂停进程

  • Ctrl+Z: 生成 sigtstp 信号

16.1.3 捕获信号

trap 命令

格式:

  1. 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
  • + : 默认作业, 未指定作业号时使用该作业, 只有一个
  • - : 下一个默认作业, 只有一个

参数:

image.png

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 启动脚本

加载配置文件的优先级:

  1. $HOME/.bash_profile
  2. $HOME/.bash_login
  3. $HOM#/.profile

16.7 小结