自动化作业: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 操作步骤
- 登录到 Linux 图形桌面并打开命令提示符窗口。
-
在命令提示符下,打开文本编辑器(如
nano、pico或vi)创建jobtest.sh文件。 -
将上述脚本代码复制到
jobtest.sh文件中。 - 保存文件。
-
为文件添加执行权限:
chmod u+x jobtest.sh。 -
运行脚本:
./jobtest.sh。 -
暂停作业:按下
Ctrl+Z。 -
在后台模式下启动另一个作业副本:
./jobtest.sh &。 -
查看当前 shell 作业:
jobs。 -
以后台模式重启暂停的作业:
bg n,其中n是暂停作业的作业号。 -
再次查看当前 shell 作业:
jobs,注意之前暂停作业的状态。 -
使用
kill -9命令停止正在运行的后台作业。 -
查看当前正在运行的作业:
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 系统中更加高效地管理和运行脚本。
超级会员免费看

被折叠的 条评论
为什么被折叠?



