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 系统中更加高效地管理和运行脚本。

相关推荐

Linux操作系统与应用 结课总结

本学期开设了Linux操作系统与应用的专业选修课。通过八周的理论学习和三次上机,我对Linxu操作系统有了更深更全面的了解。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。 这不是我第一次接触Linux操作系统。第一次接触linux是在淘宝购买某个网游单机版时,需要在本地架设服务器。根据卖家发过来的架设视频和

Gong胖子的专栏 4425

NXP eIQ与Ethos-U65:边缘AI开发实战与工业应用解析

边缘计算与机器学习(ML)的结合,正推动嵌入式系统向智能化演进。其核心原理是将AI推理能力从云端部署到网络边缘的设备端,通过本地数据处理减少延迟、节省带宽并增强隐私。这一技术的关键价值在于为资源受限的嵌入式环境提供了实时、低功耗的智能决策能力。在应用场景上,它广泛服务于工业自动化、预测性维护和智能物联网设备。实现这一目标依赖于强大的软硬件协同开发工具链,例如集成了图形化模型优化工具和针对特定微处理器架构(如Arm Cortex-M系列)优化的推理引擎,能够有效降低开发门槛。本文聚焦于NXP eIQ开发环境及

weixin_30843605的博客 395

别再只会用md5sum了!Linux文件校验的进阶玩法:sha256sum对比与自动化监控

本文探讨了Linux文件校验从md5sum到更安全的sha256sum的演进,分析了MD5算法的碰撞漏洞风险。文章提供了构建多算法校验脚本的实用方法,并介绍了利用inotify-tools实现文件实时监控,以及如何将完整性校验集成到CI/CD流水线中,构建自动化的文件防护体系。

weixin_29230059的博客 388

从零到ETL:我用Kettle Spoon做的第一个数据同步‘作业’,竟然这么简单?

本文详细介绍了如何使用Kettle Spoon从零开始构建ETL数据同步作业,包括环境准备、作业设计、实战案例及性能优化。通过具体步骤和代码示例,帮助新手快速掌握Kettle的核心功能,实现高效数据清洗和转换。

Bob1228的专栏 365

ChatGPT浏览器自动化实战:9个即用型Puppeteer脚本

浏览器自动化是连接AI能力与真实业务系统的桥梁,其核心在于稳定操控网页DOM、应对动态结构变化与反爬机制。基于Puppeteer的轻量级方案,相比Selenium和Playwright,在单浏览器(Chrome)场景下具备更高执行精度、更快错误定位能力和更低维护成本。技术价值体现在智能等待、DOM快照适配、真实浏览器运行等工程化设计,广泛应用于竞品监控、客服工单、CRM数据同步、知识库更新等高频重复性任务。本文聚焦ChatGPT驱动的浏览器自动化落地实践,提供9个经生产验证的Hands-On脚本及避坑指南。

weixin_33829657的博客 404

Windows下用OpenClaw:WSL环境搭建与工作流自动化实战

OpenClaw是一款面向开发者的本地智能工作流代理工具,本质是将命令行操作、API调用和日志检查结构化编排的CLI工作流引擎。其核心原理基于YAML定义的可复用Skill(技能单元),结合上下文感知执行与失败重试机制,实现‘用自然语言触发自动化任务’的技术价值。典型应用场景包括生产环境状态巡检、跨系统文件清理(如C盘Temp目录)、内部服务健康监测等。由于OpenClaw深度依赖POSIX进程模型与信号处理能力,Windows用户必须通过WSL2子系统运行——这使其成为Windows平台实现Linux原生

weixin_34353714的博客 478

atop:Linux系统级故障归因与时间维度诊断工具

atop并非top的增强替代品,而是面向Linux系统健康监测的高精度诊断工具,其核心原理在于以分钟级粒度持续采集CPU负载队列、磁盘IO延迟、内存页回收压力、网络软中断等底层指标,并保留完整进程级资源消耗轨迹。这种‘黑匣子’式快照机制,赋予它远超vmstat或iostat的事后归因能力,尤其适用于微服务、容器化环境中定位跨层瓶颈——如LVM缓存争用、NVMe驱动TRIM阻塞、JVM匿名映射泄漏等典型问题。本文深入解析atop的实时视图、历史回放与进程追踪三重时间维度,结合真实生产案例,揭示如何通过CPL、

weixin_33709219的博客 412

Void Linux深度解析:runit初始化与xbps包管理的轻量稳定实践

Linux发行版中的init系统与包管理器是决定系统可靠性、启动速度和运维复杂度的核心组件。runit以极简设计实现进程监督与服务管理,避免systemd的高耦合风险;xbps则通过原子更新、无运行时依赖解析和二进制压缩优化,提供确定性安装体验。这类技术选型在嵌入式设备、老旧硬件及边缘服务器场景中尤为关键,能显著降低内存占用、提升启动鲁棒性,并增强故障隔离能力。本文聚焦Void Linux这一典型代表,深入剖析其runit初始化机制、xbps包管理原理及musl/glibc双ABI策略,为追求轻量、可控与长

weixin_30363981的博客 420

Rocky Linux 9自动化安全更新实战:内核同步与systemd治理

Linux服务器安全更新是保障生产环境稳定性的基础能力,其核心在于理解包管理原理、内核生命周期与初始化系统协同机制。Rocky Linux 9基于RHEL 9,采用dnf模块化仓库、kpatch热补丁支持及严格的ABI兼容策略,使安全更新不再等同于简单执行update命令。技术价值体现在24小时内闭环修复CVE漏洞、避免因grub配置不同步导致启动失败、支撑百台服务器批量可审计更新。典型应用场景包括金融后台、Web集群与数据库节点的无人值守加固。本文聚焦Rocky Linux 9的dnf-automatic

weixin_30460489的博客 307

H100裸金属集群如何实现65%训练成本优化

GPU算力成本并非单纯由硬件价格决定,而是深度耦合于虚拟化开销、存储IO效率、网络通信延迟与调度策略等底层基础设施因素。在大模型训练场景中,NVLink拓扑感知、裸金属直通、GPUDirect RDMA和分片亲和调度等关键技术,能显著降低PCIe带宽截断、NCCL通信延迟与IO等待等隐性损耗。相比通用云平台的KVM虚拟化架构,面向AI训练定制的物理层控制可提升GPU真实利用率至94%以上,并将每千token训练成本压缩至行业均值的39%。本文聚焦H100集群在分布式训练中的拓扑优化与成本归因,为AI基础设施

csdn864883的博客 389

主流Linux发行版选型指南:从CentOS、Ubuntu到Rocky Linux的演变与抉择

本文深入分析了主流Linux发行版(CentOS、Ubuntu、Rocky Linux等)的演变历程与选型策略,特别针对企业级应用场景提供详细对比。从支持周期、软件生态到硬件兼容性,帮助读者根据稳定性需求、云原生支持等关键因素做出明智选择,并分享实战迁移技巧与优化方案。

clijovtbq401783153的博客 369

【信息科学与工程学】计算机科学与自动化——第三十五篇 调度理论和调度算法01——资源调度算法

算法逻辑

weixin_49199313的博客 683

深入解析DDR5 RFM机制:从JESD79-5标准到硬件实现

本文深入解析了DDR5内存标准中的关键机制——RFM(Refresh Management)。文章从JESD79-5标准出发,详细阐述了RFM如何通过RAA计数器实现从被动定时到主动响应的智能刷新管理,并探讨了其硬件实现细节、命令调度挑战及系统级设计考量,为芯片设计工程师优化DDR5内存子系统性能与可靠性提供了实践指导。

fff88的博客 487

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

基于STM32设计的智能水母投喂器(华为云IOT)_170

本项目利用STM32单片机控制各种传感器和水泵等设备,能够自动检测和调整水温和水质等参数,自动换水,自动供氧等等,充分满足了水母的养殖要求和需要。同时,根据水母喜欢的光环境,添加了RGB氛围灯,以及可以手动控制的喂食器等功能,提升了水母养殖的便利性和趣味性。

8806

36、真核生物RNA PolII启动子预测相关研究

本文综述了真核生物RNA聚合酶II启动子预测的研究进展,涵盖转录调控机制、核心启动子元件(如TATA框、INR、GC框)、转录因子结合位点预测的挑战与方法。介绍了基于权重矩阵、神经网络和隐马尔可夫模型等多种启动子预测算法,并探讨了启动子分类策略及评分加权方法。通过Hertz-Stormo-Hartzell流程和基因微阵列分析实例,展示了如何识别保守调控序列。文章还总结了当前预测技术的局限性,提出了整合多组学数据、开发深度学习模型、加强实验验证等未来研究方向,旨在提升启动子识别的准确性与生物学意义。

palm99的专栏 187

YOLO26剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

针对没有如何去选择剪枝的内容LAMP是层自适应幅度调整剪枝,无需任何参数,通过算法内部自己计算每个层的重要程度进行剪枝。基于权重重要程度和该层权重大小关系,权重越大表明该层越重要的思想进行优化。这个跟我前面说的非结构化全局剪枝是一个解法(MP),也就是lamp是在我前面那个非结构化剪枝的基础上进行优化的。但是这个逐层进行非结构剪枝目前还没有一个清晰的概念,确定每个层要剪枝多少。LAMP得分是一个平方权重大小,由层中所有“幸存权重”的总和归一化。

m0_64661770的博客 673

【SystemVerilog基础】SystemVerilog Assertion 概述

断言主要是描述复杂的设计行为;是传统验证方法学一个很好的补充,可以检查到电路内部细节,相当于一种白盒验证,传统的验证方法学是纯粹的黑盒验证!property跟上面的sequence差别不大,唯一有差别可能多了两个implication(|->,|=>)注意,当有前置条件时,不满足前置条件不会fail,而是伪真!上面这个因为没有前置条件,每个周期都会去检查!注意:当没有前置条件时,不满足条件会直接fail!

MoorePlus的博客 332

015:机载三维激光扫描技术相关知识

机载三维激光扫描系统(LiDAR)是集激光、GPS、INS等尖端技术于一体的三维航空遥感技术,能高效准确获取地表三维信息。该系统由GPS、INS、激光扫描测距系统、成像装置和工作平台组成,各部件协同工作以获取精确的空间定位、运动状态、地表三维坐标及真实色彩信息。通过制定飞行计划、安置GPS基站、激光扫描测量、惯性测量及获取高清数码影像等步骤,机载LiDAR技术能实时获取大范围高精度三维数据。该技术具有扫描速度快、精度高、全数字特征等优势,广泛应用于测绘、工程、环境监测和城市建设等领域,如城市三维模型重建、灾

qq_31762031的博客 1726

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 8、Unreal Engine蓝图使用全解析
下一篇: 9、消息驱动 Bean 与 JMS 详解
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值