1. 处理信号

1.1 Linux 信号

常见的 Linux 信号如下表所示:

信号 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽可能终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程
19 SIGCONT 继续运行停止的进程

默认情况下,bash shell 会忽略收到的任何 SIGQUIT (3) 和 SIGTERM (5) 信号(正因为这样,交互式 shell 才不会被意外终止)。但是 bash shell 会处理收到的 SIGHUP (1) 和 SIGINT (2) 信号。

如果 bash shell 收到了 SIGHUP 信号,比如当你要离开一个交互式 shell,它就会退出。但在退出之前,它会将 SIGHUP 信号传给所有由该 shell 所启动的进程(包括正在运行的 shell 脚本)。

通过 SIGINT 信号,可以中断 shell。Linux 内核会停止为 shell 分配 CPU 处理时间。这种情况发生时,shell 会将 SIGINT 信号传给所有由它所启动的进程,以此告知出现的状况。

1.2 生成信号

  1. 中断进程

    Ctrl+C 组合键会生成 SIGINT 信号,并将其发送给当前在 shell 中运行的所有进程。

  2. 暂停进程

    Ctrl+Z 组合键会生成一个 SIGTSTP 信号,停止 shell 中运行的任何进程。停止(stopping)进程跟终止(terminating)进程不同:停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行。

    $ sleep 100
    ^Z
    [1]+ Stopped sleep 100
    $
    

    方括号中的数字是 shell 分配的作业号(job number)。shell 将 shell 中运行的每个进程称为作业,并为每个作业分配唯一的作业号。

2. 以后台模式运行脚本

2.1 后台运行脚本

以后台模式运行 shell 脚本非常简单。只要在命令后加个 & 符就行了。

$ cat test4.sh
#!/bin/bash
# Test running in the background
#
count=1
while [ $count -le 10 ]
do
sleep 1
count=$[ $count + 1 ]
done
#
$
$ ./test4.sh &
[1] 3231
$

方括号中的数字是 shell 分配给后台进程的作业号。下一个数是 Linux 系统分配给进程的进程ID(PID)。Linux 系统上运行的每个进程都必须有一个唯一的 PID。

2.2 运行多个后台作业

可以在命令行提示符下同时启动多个后台作业。

$ ./test6.sh &
[1] 3568
$ This is Test Script #1
$ ./test7.sh &
[2] 3570
$ This is Test Script #2
$ ./test8.sh &
[3] 3573
$ And...another Test script
$ ./test9.sh &
[4] 3576
$ Then...there was one more test script
$

每次启动新作业时,Linux 系统都会为其分配一个新的作业号和 PID。通过 ps 命令,可以看到所有脚本处于运行状态。

$ ps
PID TTY TIME CMD
2431 pts/0 00:00:00 bash
3568 pts/0 00:00:00 test6.sh
3570 pts/0 00:00:00 test7.sh
3573 pts/0 00:00:00 test8.sh
3574 pts/0 00:00:00 sleep
3575 pts/0 00:00:00 sleep
3576 pts/0 00:00:00 test9.sh
3577 pts/0 00:00:00 sleep
3578 pts/0 00:00:00 sleep
3579 pts/0 00:00:00 ps
$

注意,在 ps 命令的输出中,每一个后台进程都和终端会话(pts/0)终端联系在一起。如果终端会话退出,那么后台进程也会随之退出。

2.3 在非控制台下运行脚本

有时你会想在终端会话中启动 shell 脚本,然后让脚本一直以后台模式运行到结束,即使你退出了终端会话。这可以用 nohup 命令来实现。

nohup 命令运行了另外一个命令来阻断所有发送给该进程的 SIGHUP 信号。这会在退出终端会话时阻止进程退出。

nohup 命令的格式如下:

$ nohup ./test1.sh &
[1] 3856
$ nohup: ignoring input and appending output to 'nohup.out'
$

和普通后台进程一样,shell 会给命令分配一个作业号,Linux 系统会为其分配一个 PID 号。区别在于,当你使用 nohup 命令时,如果关闭该会话,脚本会忽略终端会话发过来的 SIGHUP 信号。

3. 作业控制

启动、停止、终止以及恢复作业的这些功能统称为作业控制。通过作业控制,就能完全控制shell环境中所有进程的运行方式了。

3.1 查看作业

jobs 命令允许查看 shell 当前正在处理的作业。脚本用 $$ 变量来显示 Linux 系统分配给该脚本PID。

jobs 命令可以查看分配给 shell 的作业。jobs 命令会显示这两个已停止/运行中的作业,以及它们的作业号和作业中使用的命令。

$ jobs
[1]+ Stopped ./test10.sh
[2]- Running ./test10.sh > test10.out &
$

要想查看作业的 PID,可以在 jobs 命令中加入 -l 选项(小写的 L)。

$ jobs -l
[1]+ 1897 Stopped ./test10.sh
[2]- 1917 Running ./test10.sh > test10.out &
$

带加号的作业会被当做默认作业。当前的默认作业完成处理后,带减号的作业成为下一个默认作业。任何时候都只有一个带加号的作业和一个带减号的作业,不管 shell 中有多少个正在运行的作业。

jobs 命令参数

参数 描述
-l (小写的L) 列出进程的PID以及作业号
-n 只列出上次shell发出的通知后改变了状态的作业
-p 只列出作业的PID
-r 只列出运行中的作业
-s 只列出已停止的作业

3.2 重启停止的作业

在 bash 作业控制中,可以将已停止的作业作为后台进程或前台进程重启。要以后台模式重启一个作业,可用 bg 命令加上作业号。

$ ./test11.sh
^Z
[1]+ Stopped ./test11.sh
$
$ bg
[1]+ ./test11.sh &
$
$ jobs
[1]+ Running ./test11.sh &
$

因为该作业是默认作业(从加号可以看出),只需要使用 bg 命令就可以将其以后台模式重启。注意,当作业被转入后台模式时,并不会列出其 PID。

如果有多个作业,你得在 bg 命令后加上作业号。

$ ./test11.sh
^Z
[1]+ Stopped ./test11.sh
$
$ ./test12.sh
^Z
[2]+ Stopped ./test12.sh
$
$ bg 2
[2]+ ./test12.sh &
$
$ jobs
[1]+ Stopped ./test11.sh
[2]- Running ./test12.sh &
$

命令 bg 2用于将第二个作业置于后台模式。注意,当使用 jobs 命令时,它列出了作业及其状态,即便是默认作业当前并未处于后台模式。

要以前台模式重启作业,可用带有作业号的 fg 命令。

$ fg 2
./test12.sh
This is the script's end...
$

4. 定时运行作业

待补充

Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务相关推荐

  1. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

  2. linux系统管理学习笔记之八---linux文件与目录的管理及权限

    linux系统管理学习笔记之八---linux文件与目录的管理及权限 2010-01-05 09:00:49 标签:权限 管理 文件目录 linx [推送到技术圈] 版权声明:原创作品,允许转载,转载 ...

  3. Linux+javaEE学习笔记之Linux网络环境配置

    Linux+javaEE学习笔记之Linux网络环境配置 网络知识简单介绍: Ip地址是:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物 ...

  4. linux系统管理学习笔记之一-------linux解压缩命令

    linux系统管理学习笔记之一-------linux解压缩命令 2009-12-29 11:52:55 标签:linux tar [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接 ...

  5. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)

    1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...

  6. Linux shell 学习笔记(2)— 监测程序、磁盘空间和处理文件(ps -ef、top、kill、df、du 、grep、tar)

    1. 监测程序 1.1 检查进程 默认情况下,ps 命令只会显示运行在当前控制台下的属于当前用户的进程. $ ps PID TTY TIME CMD 3081 pts/0 00:00:00 bash ...

  7. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  8. Linux shell 学习笔记(1)— 文件和目录(查看、创建、复制、软硬链接、重命名及删除操作)

    1. 启动 shell /etc/passwd 文件包含了所有系统用户账户列表以及每个用户的基本配置信息: christine:x:501:501:Christine Bresnahan:/home/ ...

  9. Linux | Shell 学习笔记(二)Shell 流程控制 if、case、for、while| read读取输入 | 函数的使用 | cut、sed、awk、sort命令 +Demo

    文章目录 参考资料 运行环境 一.流程控制 1.1 if 判断 1.2 case 语句 1.3 for 循环 1.4 while 循环 二. read 读取控制台输入 三.函数 3.1 系统函数 ba ...

最新文章

  1. ajax跨界表单,ajax使用jsonp解决跨域问题
  2. ZABBIX 4.0 LTS+Grafana5.3部署
  3. UVa122-Trees on the level
  4. 网络适配器有感叹号不能上网_笔记本电脑显示无internet安全,不能无线上网怎么办...
  5. Tengine 反向代理状态检测
  6. 【实战 Ids4】║ 给授权服务器加个锁——HTTPS配置
  7. centos7创建asm磁盘_ASM环境下防止误将数据文件扩容到本地文件系统的方法
  8. TomCat使用以及端口号被占用的处理方法
  9. MTK平台Android4.4 拍照默认图片格式修改
  10. 论文浅尝 | 基于局内去噪和迁移学习的关系抽取
  11. 3位水仙花数计算pythonoj_Python解答蓝桥杯省赛真题之从入门到真题
  12. 【Mac Buf Install Solution】Mac Buf Not Provide support for this old version Solution
  13. leecode练习--942、增减字符串匹配
  14. 排序算法第一篇——插入排序
  15. J2ME 模拟短信发送界面开发程序
  16. php递归还原,PHP递归调用的小技巧讲解-PHP递归返回值时出现的问题解...-PHP递归算法的详细示例分析_169IT.COM...
  17. 15款超好用的短链接在线生成器(新浪t.cn、腾讯url.cn)
  18. Boost.Asio Library
  19. python爬取微博热搜榜
  20. python中\r的意义及用法

热门文章

  1. HJ107 二分法求求解立方根
  2. 2022-2028年中国服装行业分析报告-产业规模现状与发展规划趋势
  3. 2019.01-02 总结
  4. 字符常量和仅包含一个字符的字符串之间的区别
  5. LeetCode简单题之字符串转化后的各位数字之和
  6. LeetCode简单题之检查整数及其两倍数是否存在
  7. LeetCode简单题之二叉搜索树的范围和
  8. LeetCode简单题之至少是其他数字两倍的最大数
  9. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
  10. GStreamer跨平台多媒体框架