65、自动化作业:Linux 系统中的脚本调度与管理

自动化作业:Linux 系统中的脚本调度与管理

1. 作业控制基础

在 Linux 系统中,有时需要同时运行多个脚本或程序,这就涉及到作业控制。例如,我们可以启动、暂停、停止和重启作业。

1.1 启动与暂停作业

以下是一个示例,展示了如何启动和暂停作业:

$ ./test2.sh
This is a test program 29090
Loop #1
[2]+  Stopped                 ./test2.sh

在这个例子中,我们启动了 test2.sh 脚本,然后通过 Ctrl+Z 组合键暂停了该作业。

1.2 查看作业状态

使用 jobs -l 命令可以查看当前 shell 会话中所有作业的状态:

$ jobs -l
[1]  29075 Stopped                 ./test2.sh
[2]-  29090 Stopped                 ./test2.sh
[3]+ 29105 Stopped                 ./test2.sh

这里, + 号表示默认作业, - 号表示次默认作业。

1.3 停止作业

使用 kill -9 命令可以停止指定 PID 的作业:

$ kill -9 29105
$ jobs -l
[1]-  29075 Stopped                 ./test2.sh
[2]+  29090 Stopped                 ./test2.sh

1.4 重启作业

可以将暂停的作业以后台或前台模式重启。
- 后台模式 :使用 bg 命令,例如 bg 2 可以将作业号为 2 的作业以后台模式重启。

$ bg 2
[2]+ ./test2.sh &
Test 2 Loop #2 output
$ Test 2 Loop #3 output
Test 2  Loop #4 output
  • 前台模式 :使用 fg 命令,例如 fg 1 可以将作业号为 1 的作业以前台模式重启。
$ jobs
[1]+  Stopped                 ./test2.sh
$ fg 1
./test4
Loop #2
Loop #3

2. 定时运行脚本

在实际应用中,我们可能需要在特定时间运行脚本,常见的方法有使用 at 命令和 cron 表。

2.1 使用 at 命令

at 命令允许我们指定 Linux 系统运行脚本的时间。它将作业提交到队列中,并由 atd 命令在后台检查队列,当到达指定时间时运行作业。

2.1.1 at 命令格式

基本格式为:

at [-f filename] time
  • -f 参数:指定要运行的脚本文件。
  • time 参数:指定作业运行的时间,可以使用多种时间格式,如 10:15 10:15 p.m. now noon 等。
2.1.2 示例
$ date
Thu Feb 24 18:48:20 EST 2022
$ at -f test3.sh 18:49
job 2 at Thu Feb 24 18:49:00 2022
2.1.3 作业队列

at 命令将作业提交到作业队列中,共有 26 个不同优先级的作业队列,用小写字母 a z 表示。默认情况下,所有 at 作业都提交到最高优先级的 a 队列。

2.1.4 查看作业输出

作业运行时没有关联的监视器,系统会将作业的输出通过邮件发送给提交作业的用户。可以使用 -m 选项强制生成邮件,即使脚本没有输出。

2.1.5 查看和管理作业
  • 查看待处理作业 :使用 atq 命令可以查看系统中待处理的作业。
$ at -f test3.sh 10:15
warning: commands will be executed using /bin/sh
job 7 at 2022-03-04 10:15
$ at -f test5 4PM
warning: commands will be executed using /bin/sh
job 8 at 2022-03-03 16:00
$ at -f test5 1PM tomorrow
warning: commands will be executed using /bin/sh
job 9 at 2022-03-04 13:00
$ atq
7       2022-03-04 10:15 a
8       2022-03-03 16:00 a
9       2022-03-04 13:00 a
  • 删除作业 :使用 atrm 命令可以删除指定作业号的待处理作业。
$ atrm 8
$ atq
7       2022-03-04 10:15 a
9       2022-03-04 13:00 a

2.2 使用 cron

cron 程序用于定期运行脚本。它在后台运行,检查 cron 表以确定何时运行作业。

2.2.1 cron 表格式

cron 表的每一行格式如下:

min hour dayofmonth month dayofweek command

其中,各字段的含义如下:
| 字段 | 含义 |
| ---- | ---- |
| min | 分钟(0 - 59) |
| hour | 小时(0 - 23) |
| dayofmonth | 月份中的日期(1 - 31) |
| month | 月份(1 - 12) |
| dayofweek | 星期几(0 - 6,0 表示星期日) |
| command | 要运行的命令 |

2.2.2 示例
  • 每天上午 10:15 运行命令: 15 10 * * * command
  • 每周一下午 4:15 运行命令: 15 16 * * 1 command
  • 每月 1 号中午 12 点运行命令: 00 12 1 * * command
2.2.3 构建 cron

所有系统用户都可以有自己的 cron 表。使用 crontab 命令来管理 cron 表:
- 查看 cron crontab -l
- 编辑 cron crontab -e

2.3 Systemd 定时器

对于使用 systemd 启动方法的系统,还可以使用 Systemd 定时器来自动启动程序。定时器单元文件以 .timer 为扩展名,包含一个 [Timer] 部分,用于定义启动事件的指令。

以下是一些常用的定时器单元文件 [Timer] 部分的指令:
| 指令 | 描述 |
| ---- | ---- |
| AccuracySec | 指定定时器的精度,默认精度为一分钟 |
| OnActiveSec | 相对于定时器激活时刻定义定时器 |
| OnBootSec | 相对于系统启动时刻定义定时器 |
| OnCalendar | 以特定日期/时间值定义定时器 |
| OnStartupSec | 相对于 systemd 程序启动时刻定义定时器 |
| OnUnitActiveSec | 相对于定时器单元上次激活时刻定义定时器 |
| OnUnitInactiveSec | 相对于定时器单元上次停用时刻定义定时器 |
| Persistent | 设置时,定时器单元上次触发的时间将存储在磁盘上 |
| RandomizedDelaySec | 随机延迟定时器激活时间 |
| RemainAfterElapse | 设置时,过期的定时器单元保持加载,允许使用 systemctl 查询其状态 |
| Unit | 定义定时器到期时要启动的单元文件 |
| WakeSystem | 设置时,定时器单元将使系统从挂起状态恢复 |

3. 实践操作

以下是一个实践操作,帮助你熟悉作业控制:

3.1 创建测试脚本

#!/bin/bash
# jobtest.sh - run the sleep command in a loop for job testing
echo "This is a test program $$"
count=1
while [ $count -le 10 ] ; do
    echo "Program: $$ Loop #$count"
    sleep 10
    count=$[ $count + 1 ]
done
echo "This is the end of the test program"

3.2 操作步骤

  1. 登录到 Linux 图形桌面并打开命令提示符窗口。
  2. 在命令提示符下,打开文本编辑器(如 nano pico vi )创建 jobtest.sh 文件。
  3. 将上述脚本代码复制到 jobtest.sh 文件中。
  4. 保存文件。
  5. 为文件添加执行权限: chmod u+x jobtest.sh
  6. 运行脚本: ./jobtest.sh
  7. 暂停作业:按下 Ctrl+Z
  8. 在后台模式下启动另一个作业副本: ./jobtest.sh &
  9. 查看当前 shell 作业: jobs
  10. 以后台模式重启暂停的作业: bg n ,其中 n 是暂停作业的作业号。
  11. 再次查看当前 shell 作业: jobs ,注意之前暂停作业的状态。
  12. 使用 kill -9 命令停止正在运行的后台作业。
  13. 查看当前正在运行的作业: jobs

通过以上步骤,你可以更好地掌握 Linux 系统中的作业控制和定时运行脚本的方法。

4. 总结与常见问题解答

4.1 总结

在 Linux 系统中,作业控制和脚本调度是非常重要的功能。以下是对前面内容的总结:
- 作业控制 :可以通过 jobs 命令查看作业状态,使用 bg fg 命令分别将作业在后台和前台模式下重启,使用 kill 命令停止作业。
- 定时运行脚本
- at 命令 :适用于一次性定时任务,支持多种时间格式,作业输出通过邮件发送。
- cron :用于定期运行脚本,通过特定格式的 cron 表条目指定运行时间。
- Systemd 定时器 :对于使用 systemd 启动方法的系统,可使用定时器单元文件更精确地控制程序启动时间。

4.2 常见问题解答

以下是一些常见问题及其解答:
| 问题 | 解答 |
| ---- | ---- |
| 如何在后台运行脚本? | 在命令后添加 & 符号,如 ./test.sh & ;若要脚本在终端关闭后继续运行,可使用 nohup 命令,如 nohup ./test.sh & 。 |
| 如何停止前台运行的脚本? | 按下 Ctrl+C 组合键。 |
| 如何暂停前台运行的脚本? | 按下 Ctrl+Z 组合键。 |
| 如何确定默认作业? | 在 jobs 输出中,带有 + 号的作业为默认作业。 |
| 如何将后台作业切换到前台? | 使用 fg 命令,后跟作业号,如 fg 1 。 |
| 如何在特定时间运行脚本? | 可以使用 at 命令,如 at -f test.sh 10:15 ;若要定期运行,可使用 cron 表,编辑 crontab 文件添加相应条目。 |

4.3 流程图:作业控制与脚本调度流程

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(启动作业):::process
    B --> C{是否需要暂停?}:::decision
    C -->|是| D(按下 Ctrl+Z 暂停作业):::process
    C -->|否| E{是否需要在后台运行?}:::decision
    D --> E
    E -->|是| F(使用 & 或 bg 命令):::process
    E -->|否| G(前台运行):::process
    F --> H(使用 jobs 查看作业状态):::process
    G --> H
    H --> I{是否需要停止作业?}:::decision
    I -->|是| J(使用 kill 命令):::process
    I -->|否| K{是否需要定时运行?}:::decision
    J --> L([结束]):::startend
    K -->|是| M{使用 at 还是 cron?}:::decision
    K -->|否| L
    M -->|at| N(使用 at 命令指定时间):::process
    M -->|cron| O(编辑 crontab 文件):::process
    N --> L
    O --> L

5. 复习与巩固

为了帮助你巩固所学知识,以下是一些复习问题及答案:
1. 问题 :Frank 想在控制台会话中以后台模式运行他的大量数据计算应用程序,他需要使用什么命令?
- 答案 :在命令后添加 & 符号,所以选 B。
2. 问题 :要将 shell 脚本与当前控制台断开连接,使其在控制台退出后继续运行,应使用什么命令?
- 答案 :使用 nohup 命令,选 E。
3. 问题 :Melanie 运行 shell 脚本时,发现它占用了系统所有内存,她该如何停止它?
- 答案 :在脚本运行时按下 Ctrl+C 组合键,选 C。
4. 问题 :如何在控制台会话中暂时暂停前台运行的 shell 脚本?
- 答案 :按下 Ctrl+Z 组合键,选 A。
5. 问题 :如何确定控制台会话中运行的默认作业?
- 答案 :在 jobs 输出中,作业号旁边有 + 号的为默认作业,选 C。
6. 问题 :Barbara 有一个应用程序在控制台会话的后台运行,她需要将其切换到前台模式,应使用什么命令?
- 答案 :使用 fg 命令,选 B。
7. 问题 :什么命令可以让你在特定时间运行 shell 脚本?
- 答案 :使用 at 命令,选 C。
8. 问题 :Nick 需要在他的 Linux 系统上每天午夜运行一份报告,他应该怎么做?
- 答案 :使用 cron 表来调度作业,选 D。
9. 问题 cron 表条目 10 5 * * * myscript 什么时候会运行指定的 shell 脚本?
- 答案 :该条目表示每天早上 5:10 运行脚本,选 E。
10. 问题 :Jane 需要检查她的用户账户中自动调度运行的作业,她应该使用什么命令列出 cron 表条目?
- 答案 :使用 crontab -l 命令,选 C。

通过这些复习问题,你可以更好地理解和掌握 Linux 系统中作业控制和脚本调度的知识。希望这些内容对你有所帮助,让你在 Linux 系统中更加高效地管理和运行脚本。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值