文章目录
欢迎访问个人网络日志🌹🌹知行空间🌹🌹
Linux Shell任务控制
通常情况下运行脚本的方式就是以实时模式在命令行界面上直接运行,除此之外还有很多其他的运行脚本的方式,如后台运行,定时运行等等。除运行方式外,还可以对脚本程序的运行进行控制,包括向脚本发送信号、修改脚本的优先级以及在脚本运行时从暂停切换到运行模式。
1)信号
Linux
利用信号与运行在系统中的进程进行通信,可以通过对脚本进行编程,使其在收到特定信号时执行特定命令。
信号 | 值 | 描述 |
---|---|---|
1 | SIGHUP | 挂起进程 |
2 | SIGINT | 终止进程 |
3 | SIGQUIT | 停止进程 |
9 | SIGKILL | 无条件终止进程 |
15 | SIGTERM | 尽可能终止进程 |
17 | SIGSTOP | 无条件停止进程,但不是终止进程 |
18 | SIGTSTP | 停止或暂停进程,但不终止进程 |
19 | SIGCONT | 继续运行停止的进程 |
默认情况下,交互式shell
终端本身的进程会忽略收到的任何 SIGQUIT (3)
和 SIGTERM (5)
信号,因此其不会被意外终止。
如果bash shell
收到了 SIGHUP
信号,比如当要离开一个交互式shell
时,它就会退出。但在退出之前,它会将 SIGHUP
信号传给所有由该shell
所启动的进程。
通过键盘生成信号
Ctrl+C
组合键会生成 SIGINT
信号,并将其发送给当前在shell
中运行的所有进程。
Ctrl+Z
组合键会生成一个 SIGTSTP
信号,停止shell
中运行的任何进程。这样可以在进程运行期间暂停进程,而无需终止它。这样可以在不终止进程的情况下使用户深入脚本内部一窥究竟。
停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行。
要想启动停止的进程可以使用fg
或bg
在前台和后台启动。
$ sleep 100
# ^Z
# [1]+ 已停止 sleep 100
方括号中的数字是shell
分配的作业号 (job number)
。
可以用 ps
命令来查看已停止的作业。
$ ps -l
# F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
# 0 T 1001 116014 113239 0 80 0 - 2791 do_sig pts/0 00:00:00 sleep
在 S
列中(进程状态), ps
命令将已停止作业的状态为显示为 T
。这说明命令要么被跟踪,要么被停止了。
在有已停止作业存在的情况下退出shell
会终止已停止作业。
trap 命令捕获信号
trap
命令允许用户来指定shell
脚本要监视并从shell
中拦截的Linux
信号。当脚本收到了 trap
命令中列出的信号,会执行用户指定的操作。
trap
命令的格式:
trap commands signals
示例,
#!/bin/bash
trap "echo 'Ctrl-C Pressed'" SIGINT
echo This is a test
c=1
while [ $c -le 5 ]
do
echo "Loop #$c"
sleep 1
c=$[ $c +