当前位置: 首页 > news >正文

shell脚本控制——定时运行作业

在使用脚本时,你也许希望脚本能在以后某个你无法亲临现场的时候运行。Linux系统提供了多个在预选时间运行脚本的方法:at命令、cron表以及anacron。每种方法都使用不同的技术来安排脚本的运行时间和频率。接下来将依次介绍这些方法。

1.使用at命令调度作业

at命令允许指定Linux系统何时运行脚本。该命令会将作业提交到队列中,指定shell何时运行该作业。

at的守护进程atd在后台运行,在作业队列中检查待运行的作业。很多Linux发行版会在启动时运行此守护进程,但有些发行版甚至都没安装这个软件包。如果你的Linux属于后一种情况,则可以自行安装,软件包的名字如你所料,就是at。

atd守护进程会检查系统的一个特殊目录(通常位于/var/spool/at或/var/spool/cron/atjobs),从中获取at命令提交的作业。在默认情况下,atd守护进程每隔60秒检查一次这个目录。如果其中有作业,那么atd守护进程就会查看此作业的运行时间。如果时间跟当前时间一致,就运行此作业。

接下来将介绍如何用at命令提交作业以及如何管理作业。

1.at命令的格式

at命令的基本格式非常简单:

at  [-f  filenametime

在默认情况下,at命令会将STDIN的输入放入队列。你可以用-f选项指定用于从中读取命令(脚本文件)的文件名。

time选项指定了你希望何时运行该作业。如果指定的时间已经过去,那么at命令会在第二天的同一时刻运行指定的作业。

指定时间的方式非常灵活。at命令能识别多种时间格式。

  • 标准的小时和分钟,比如10:15
  • AM/PM指示符,比如10:15 PM。
  • 特定的时间名称,比如now、noon、midnight或者teatime(4:00 p.m.)。

除了指定运行作业的时间,也可以通过不同的日期格式指定特定的日期。

  • 标准日期,比如MMDDYY、MM/DD/YY或DD.MM.YY。
  • 文本日期,比如Jul 4或Dec 25,加不加年份均可。
  • 时间增量。
    • Now + 25 minutes
    • 10:15 PM tomorrow
    • 10:15 + 7 days

提示        at命令可用的日期和时间格式有很多种,具体参见/usr/share/doc/at/timespec文件。

在使用at命令时,该作业会被提交至作业队列。作业队列保存着通过at命令提交的待处理作业。针对不同优先级,有52种作业队列。作业队列通常用小写字母a~z和大写字母A~Z来指代,A队列和a队列是两个不同的队列。

注意        在几年前,batch命令也能指定脚本的执行时间。这是个很独特的命令,因为它可以安排脚本在系统处于低负载时运行。现在,batch命令只不过是一个脚本而已(/usr/bin/batch) ,它会调用at命令将作业提交到b队列中。

作业队列的字母排序越高,此队列中的作业运行优先级就越低(谦让度更大) 。在默认情况下,at命令提交的作业会被放入a队列。如果想以较低的优先级运行作业,可以用-q选项指定其他的队列。如果相较于其他进程你希望你的作业尽可能少地占用CPU,可以将其放入z队列。

2.获取作业的输出

当在Linux系统中运行at命令时,显示器并不会关联到该作业。Linux系统反而会将提交该作业的用户email地址作为STDOUT和STDERR。任何送往STDOUT或STDERR的输出都会通过邮件系统传给该用户。

来看一个在CentOS发行版中使用at命令调度作业的例子:

$ cat tryat.sh
#!/bin/bash
# Trying out the at command
#
echo "This script ran at $(date +%B%d,%T)"
echo
echo "This script is using the $SHELL shell."
echo
sleep 5
echo "This is the script's end."
#
exit
$
$ at -f tryat.sh now
warning: commands will be executed using /bin/sh
job 3 at Fri Feb 7 16:23:00 2025
$

at命令会显示分配给作业的作业号以及为作业安排的运行时间。-f选项指明使用哪个脚本文件。now指示at命令立刻执行该脚本。

注意        无须在意at命令输出的警告消息,因为脚本的第一行是#!/bin/bash,该命令会由bash shell执行。

使用email作为at命令的输出极不方便。at命令通过sendmail应用程序发送email。如果系统中没有安装sendmail,那就无法获得任何输出。因此在使用at命令时,最好在脚本中对STDOUT和STDERR进行重定向,如下例所示:

$ cat tryatout.sh
#!/bin/bash
# Trying out the at command redirecting output
#
outfile=$HOME/scripts/tryat.out
#
echo "This script ran at $(date + %B%d,%T)" > $outfile
echo >> $outfile
echo "This script is using the $SHELL shell." >> $outfile
echo >> $outfile
sleep 5
echo "This is the script's end." >> $outfile
#
exit
$
$ at -M -f tryatout.sh now
warning: commands will be executed using /bin/sh
job 4 at Fri Feb 7 16:48:00 2025
$
$ cat $HOME/scripts/tryat.out
This scrit ran at Feb7,16:48:21This script is using the /bin/bash shell.This is the script's end.
$

 如果不想在at命令中使用email或者重定向,则最好加上-M选项,以禁止作业产生的输出信息。

3.列出等待的作业

atq命令可以查看系统中有哪些作业在等待:

$ at -M -f tryatout.sh teatime
warnign: commands will be executed using /bin/sh
job 5 at Sat Feb 8 16:00:00 2025
$
$ at -M -f tryatout.sh tomorrow
warning: commands will be executed using /bin/sh
jb 6 at Sat Feb 8 16:53:00 2025
$
$ at -M -f tryatout.sh 20:30
warning: commands will be executed using /bin/sh
job 7 at Fri Feb 7 20:30:00 2025
$
$ at -M -f tryatout.sh now+1hour
warning: commands will be executed using /bin/sh
job 8 at Fri Feb 7 17:54:00 2025
$
$ atq
1      Fri Feb 7 16:11:00 2025 a christine
5      Sat Feb 8 16:00:00 2025 a christine
6      Sat Feb 8 16:53:00 2025 a christine
7      Fri Feb 7 20:30:00 2025 a christine
8      Fri Feb 7 17:54:00 2025 a christine
$

作业列表中显示了作业号、系统运行该作业的日期和时间,以及该作业所在的作业队列。

4.删除作业

一旦知道了哪些作业正在作业队列中等待,就可以用atrm命令删除等待中的作业。指定要删除的作业号即可:

$ atq
1      Fri Feb 7 16:11:00 2025 a christine
5      Sat Feb 8 16:00:00 2025 a christine
6      Sat Feb 8 16:53:00 2025 a christine
7      Fri Feb 7 20:30:00 2025 a christine
8      Fri Feb 7 17:54:00 2025 a christine
$
$ atrm 5
$
$ atq
1      Fri Feb 7 16:11:00 2025 a christine
6      Sat Feb 8 16:53:00 2025 a christine
7      Fri Feb 7 20:30:00 2025 a christine
8      Fri Feb 7 17:54:00 2025 a christine
$

只能删除自己提交的作业,不能删除其他人的。

2.调度需要定期运行的脚本

使用at命令安排在未来的预设时间运行某个脚本固然不错,但如果需要脚本在每天、每周或每月的同一时间运行呢?这时候与其频繁使用at命令,不如利用Linux系统的另一个特性。

Linux系统使用cron程序调度需要定期执行的作业。cron在后台运行,并会检查一个特殊的表(cron时间表),从中获知已安排执行的作业。

1.cron时间表

cron时间表通过一种特别饿格式指定作业何时运行,其格式如下:

minutepasthour hourofday dayofmonth month dayofweek command

cron时间表允许使用特定值、取值范围(比如1~5)或者通配符(星号)来指定各个字段。如果想在每天的10:15运行一个命令,可以使用如下cron时间表字段:

15  10  *  *  *  command

dayofmonth、month以及dayofweek字段中的通配符表明,cron会在每天10:15执行该命令。要指定一条在每周一的下午4:15(4:15 p.m.)执行的命令,可以使用军事时间(1:00 p.m.是13:00,2:00 p.m.是14:00,3:00 p.m.是15:00,以此类推),如下所示:

15  16  *  *  1  command

可以使用三字符的文本值(mon、tue、web、thu、fri、sat、sun)或数值(0或7代表周日,6代表周六)来指定dayofweek字段。

这里还有另一个例子。要想在每月第一天的中午12点执行命令,可以使用下列字段:

00  12  1  *  *  command

dayofmonth字段指定的是月份中的日期值(1~31)。

提示        聪明的你可能会思考,如何设置才能让命令在每月的最后一天执行,因为无法设置一个dayofmonth值,涵盖所有月份的最后一天。常用的解决方法是加一个if-then语句,在其中使用date命令检查明天的日期是不是某个月份的第一天(01):

00 12 28-31 * * if [ "$(date +%d -d tomorrow)" = 01 ] ; then command ; fi

这行脚本会在每天中午12点检查当天是不是当月的最后一天(28~31),如果是,就由cron执行command

另一种方法是将command替换成一个控制脚本(controlling script),在可能是每月最后一天的时候运行。控制脚本包含if-then语句,用于检查第二天是否为某个月的第一天。如果是,则由控制脚本发出命令,执行必须在当月最后一天执行的内容。

命令列表必须指定要运行的命令或脚本的完整路径。你可以像在命令行中那样,添加所需的任何选项和重定向符:

15  10  *  *  *  /home/christine/backup.sh > backup.out

cron程序会以提交作业的用户身份运行该脚本,因此你必须有访问该脚本(或命令) 以及输出文件的合理权限。

2.构建cron时间表

每个用户(包括root用户)都可以使用自己的cron时间表运行已安排好的任务。Linux提供了crontab命令来处理cron时间表。要列出已有的cron时间表,可以用-l选项:

$ crontab -l
no crontab for christine
$

在默认情况下,用户的cron时间表文件并不存在。可以使用-e选项向cron时间表添加字段。在添加字段时,crontab命令会启动一个文本编辑器,使用已有的cron时间表作为文件内容(如果时间表不存在,就是一个空文件)。

3.浏览cron目录

如果创建的脚本对于执行时间的精确性要求不高,则用预配置的cron脚本目录会更方便。预配置的基础目录共有4个:hourly、daily、monthly和weekly。

$ ls /etc/cron.*ly
/etc/cron.daily:
0anacron  apt-compat    cracklib-runtime  logrotate  [...]
apport    bsdmainutils  dpkg              man-db     [...]/etc/cron.hourly:/etc/cron.monthly:
0anacron/etc/cron.weekly:
0anacron  man-db  update-notifier-common
$

如果你的脚本需要每天运行一次,那么将脚本复制到daily目录,cron就会每天运行它。

4.anacron程序

cron程序唯一的问题是它假定Linux系统是7 x 24小时运行的。除非你的Linux运行在服务器环境,否则这种假设未必成立。

如果某个作业在cron时间表中设置的运行时间已到,但这时候Linux系统处于关闭状态,那么该作业就不会运行。当再次启动系统时,cron程序不会再去运行那些错过的作业。为了解决这个问题,许多Linux发行版提供了anacron程序。

如果anacron判断出某个作业错过了设置的运行时间,它会尽快运行该作业。这意味着如果Linux系统关闭了几天,等到再次启动时,原计划在关机期间运行的作业会自动运行。有了anacron,就能确保作业一定能运行,这正是通常使用anacron代替cron调度作业的原因。

anacron程序只处理位于cron目录的程序,比如/etc/cron.monthly。它通过时间戳来判断作业是否在正确的计划间隔内运行了。每个cron目录都有一个时间戳文件,该文件位于/var/spool/anacron:

$ ls /var/spool/anacron
cron.daily cron.monthly cron.daily
$
$ sudo cat /var/spool/anacron/cron.daily
[sudo] password for christine:
20250208
$

anacron程序使用自己的时间表(通常位于/etc/anacrontab)来检查作业目录:

$ cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron# See anacron(8) and anacrontab(5) for details.SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root# These replace cron's entries
1      5      cron.daily      run-parts --report /etc/cron.daily
7      10     cron.weekly     run-parts --report /etc/cron.weekly
@monthly 15   cron.monthly    run-parts --report /etc/cron.monthly
$

anacron时间表的基本格式和cron时间表略有不同:

period  delay  identifier  command

period字段定义了作业的运行频率(以天为单位)。anacron程序用该字段检查作业的时间戳文件。delay字段指定了在系统启动后,anacron程序需要等待多少分钟再开始运行错过的脚本。

注意        anacron不会运行位于/etc/cron.hourly目录的脚本。这是因为anacron并不处理执行时间需求少于一天的脚本。

identifier字段是一个独特的非空字符串,比如cron.weekly。它唯一的作用是标识出现在日志消息和错误email中的作业。command字段包含了run-parts程序和一个cron脚本目录名。run-parts程序负责运行指定目录中的所有脚本。

at、cron和anacron在调度作业运行方面各占有一席之地。然而,你可能希望在用户启动新的bash shell而不是特定时刻执行某个脚本。

相关文章:

shell脚本控制——定时运行作业

在使用脚本时,你也许希望脚本能在以后某个你无法亲临现场的时候运行。Linux系统提供了多个在预选时间运行脚本的方法:at命令、cron表以及anacron。每种方法都使用不同的技术来安排脚本的运行时间和频率。接下来将依次介绍这些方法。 1.使用at命令调度作…...

LeetCode 热题 100 回顾

目录 一、哈希部分 1.两数之和 (简单) 2.字母异位词分组 (中等) 3.最长连续序列 (中等) 二、双指针部分 4.移动零 (简单) 5.盛最多水的容器 (中等) 6…...

HTML5--网页前端编程(上)

HTML5–网页前端编程(上) 1.网页 (1)网站是根据一定的规则,使用html制作的相关的网页的集合。 网页是网站上的一页,通常是html格式的文件,他要通过浏览器来阅读。网页是网站的基本元素,由图片链接声音文字等元素造成,以.html或.htm后缀结尾的文件称为html文件。 (2…...

气体控制器联动风机,检测到环境出现异常时自动打开风机进行排风;

一、功能:检测到环境出现异常时自动打开风机进行排风; 二、设备: 1.气体控制器主机:温湿度,TVOC等探头的主机,可上报数据,探头监测到异常时,主机会监测到异常可联动风机或声光报警…...

示波器使用指南

耦合方式 在示波器中,耦合方式决定了信号源与示波器输入之间的信号传输方式。具体来说,直流耦合、交流耦合和接地耦合这三种方式有不同的工作原理和应用场景,下面是它们的差异: 1. 直流耦合(DC Coupling)…...

Post-trained猜想

强化 -- 输出Action 真实的避障 ActionCond 输入Action 生成视频 原来只是仿真 没有和整个的机器人系统结合 gym生成视频 不需要后处理 obersation...

javaEE-10.CSS入门

目录 一.什么是CSS ​编辑二.语法规则: 三.使用方式 1.行内样式: 2.内部样式: 3.外部样式: 空格规范 : 四.CSS选择器类型 1.标签选择器 2.类选择器 3.ID选择器 4.通配符选择器 5.复合选择器 五.常用的CSS样式 1.color:设置字体颜色 2.font-size:设置字体大小 3…...

eclipse配置Spring

1、从eclipse下载Spring工具 进入 help – install new software… ,如下图: 点击 add ,按以下方式输入: Name : Spring Location : http://dist.springsource.com/release/TOOLS/update/e4.10/ 之后点击 add ,等待…...

爬虫技巧汇总

一、UA大列表 USER_AGENT_LIST 是一个包含多个用户代理字符串的列表,用于模拟不同浏览器和设备的请求。以下是一些常见的用户代理字符串: USER_AGENT_LIST [Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Hot Lingo 2.0),Mozilla…...

基于UVM搭验证环境

基于UVM搭验证环境基本思路: 首先,我们搭建环境时一般都有一个目标的DUT。此时,我们可以结合所要验证的的模块、是否需要VIP、验证侧重点等在典型的UVM验证环境的基础上做适当调整后形成一个大体的环境架构。比如,需要一个ahb_vip…...

【JavaWeb10】服务器渲染技术 --- JSP

文章目录 🌍一. JSP❄️1.JSP介绍❄️2.JSP 运行原理❄️3.page 指令(常用的)❄️ 4.JSP 三种常用脚本1.声明脚本2.表达式脚本3.代码脚本 ❄️5.JSP 内置对象❄️6.JSP 域对象 🌍二. EL❄️1.EL 表达式介绍❄️2.EL 运算操作❄️3.EL 的 11 个隐含对象 &…...

【Hadoop】大数据权限管理工具Ranger2.1.0编译

目录 ​编辑一、下载 ranger源码并编译 二、报错信息 报错1 报错2 报错3 报错4 一、下载 ranger源码并编译 ranger官网 https://ranger.apache.org/download.html 由于Ranger不提供二进制安装包,故需要maven编译。安装其它依赖: yum install gcc …...

微软AI研究团队推出LLaVA-Rad:轻量级开源基础模型,助力先进临床放射学报告生成

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

06排序 + 查找(D2_查找(D1_基础学习))

目录 温故而知新 -------------------------------- 讲解一:基础理论 一、什么是查找 二、为什么需要查找 -------------------------------- 讲解二:代码学习 一、顺序查找 1. 算法原理 2. 算法步骤 3. Java代码实现 4. 适用场景 5. 知识小…...

网站快速收录的秘诀:关键词布局与优化

本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/107.html 网站快速收录的秘诀中,关键词布局与优化是至关重要的环节。以下是一些关于关键词布局与优化的建议,旨在帮助网站快速被搜索引擎收录并提高排名:…...

AI大语言模型

一、AIGC和生成式AI的概念 1-1、AIGC Al Generated Content:AI生成内容 1-2、生成式AI:generative ai AIGC是生成式 AI 技术在内容创作领域的具体应用成果。 目前有许多知名的生成式 AI: 文本生成领域 OpenAI GPT 系列百度文心一言阿里通…...

03-DevOps-安装并初始化Gitlab

Gitlab可以理解为是自己搭建的GitHub,也就是自己的代码仓库。 开启macvlan 在192.168.1.10服务器上,构建Macvlan网络,这种网络模式可以为每个容器独立分配ip。 docker network create -d macvlan \--subnet192.168.1.0/24 \--ip-range192.16…...

Mac重复文件,一键查找并清理的工具

​不知果粉们,你们有没有过这样的经历:在翻找重要文件时,突然发现一大堆“孪生兄弟”——Mac重复文件?别担心,你不是一个人!今天,我们就来聊聊“Mac重复文件”,以及如何用几招轻松搞…...

Unity Mesh 切割算法详解

Mesh切割是游戏开发中实现物体断裂、破坏效果的核心技术。本教程将深入解析实时Mesh切割的数学原理,并提供完整的Unity实现方案。 一、切割原理分析 1.1 几何基础 切割平面方程:Ax By Cz D 0 顶点分类:每个顶点到平面的距离决定其位置…...

ASUS/华硕天选1 FA506I 原厂Win10 专业版系统 工厂文件 带ASUS Recovery恢复 教程

华硕工厂文件恢复系统 ,安装结束后带隐藏分区,带一键恢复,以及机器所有的驱动和软件。 支持型号:FA506IV FA506II FA506IU FA506IH 系统版本:Windows 10 专业版 文件: ycoemxt.cn/1205.html 文件格式:工…...

【计算机中级职称 信息安全工程师 备考】密码学知识,经典题目

2022年信息安全工程师下午题 题目 密码学技术也可以用于实现隐私保护,利用加密技术阻止非法用户对隐私数据的未授权访问和滥用。若某员工的用户名为“admin”,计划用RSA 对用户名进行加密,假设选取的两个素数 p47,q71,公钥加密指…...

期权帮|初识股指期货:股指期货的交割结算价是怎么来的?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 初识股指期货:股指期货的交割结算价是怎么来的? 股指期货的交割结算价是通过特定时间段内现货指数的算术平均价来确定的。 这一价格作为现金交割的基准…...

伺服使能的含义解析

前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是对伺服上使能&#…...

数据集成实例分享:金蝶云星空对接旺店通实现库存管理自动化

拆卸父项出库:金蝶云星空数据集成到旺店通企业奇门 在现代企业的运营过程中,数据的高效流动和准确处理至关重要。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将金蝶云星空的数据无缝对接到旺店通企业奇门&#xff0…...

Android 常用设计模式和实例

一、什么是设计模式? 设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块…...

模拟(典型算法思想)—— OJ例题算法解析思路

目录 一、1576. 替换所有的问号 - 力扣(LeetCode) 运行代码: 1. 输入和输出 2. 变量初始化 3. 遍历字符串 4. 替换逻辑 5. 返回结果 整体分析 1. 思路总结 2. 为什么要这样设计 3. 时间复杂度与空间复杂度 4. 边界情况 二、495. 提莫攻击 - 力扣(LeetCode) …...

Nginx配置 ngx_http_proxy_connect_module 模块及安装

1、配置完互联网yum源后,安装相关依赖软件包 [root@server soft]# yum install -y patch pcre pcre-devel make gcc gcc-c++ openssl openssh [root@server soft]# yum install openssl* 2、解压缩软件,加载模块 [root@server soft]# ls nginx-1.20.2 nginx-1.20.2.tar.gz …...

项目质量管理体系及保证措施

项目质量管理体系的核心是建立标准化流程、强化全员参与意识、实施动态监控机制。其中,标准化流程是质量管理的基石。例如,某全球500强企业通过引入ISO 9001体系,将项目缺陷率降低了37%。标准化流程不仅能明确各环节的质量要求,还…...

php 实现 deepSeek聊天对话

deepSeek 在 2025年可以说是火热。它可以说是国内版真正义意上的chatgpt。那么,如果我要实现用php 接入 deepSeek 的api呢。其实,方法也很简单。下面的代码我是自己封装过的,大家可以直接拿来使用,记得自己修改下密钥。 function…...

【Unity】性能优化:UI的合批 图集和优化

目录 前言一、合批测试二、图集 前言 注意:DC指的是Draw Call。 温馨小提示:Frame Debugger 窗口(菜单:Window > Analysis > Frame Debugger)会显示绘制调用信息,并允许您控制正在构建的帧的“回放”…...