Linux——定时运行作业

at命令

at命令允许指定Linux系统何时运行脚本。at命令会将作业提交到队列中,指定shell何时运行该作业。at的守护进程atd会以后台模式运行,检查作业队列来运行作业。大多数Linux发行 版会在启动时运行此守护进程。

atd守护进程会检查系统上的一个特殊目录(通常位于/var/spool/at)来获取用at命令提交的作业。默认情况下,atd守护进程会每60秒检查一下这个目录。有作业时,atd守护进程会检查作业设置运行的时间。如果时间跟当前时间匹配,atd守护进程就会运行此作业。

1. 命令格式:

at [-f filename] time

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

time参数指定了Linux系统何时运行该作业。如果你指定的时间已经错过,at命令会在第二天的那个时间运行指定的作业。

  • 标准的小时和分钟格式,比如10:15
  • AM/PM指示符,比如10:15PM
  • 特定可命名时间,比如now、noon、midnight或者teatime(4PM)
  • 标准日期格式,比如MMDDYY、MM/DD/YY或DD.MM.YY
  • 文本日期,比如Jul4或Dec25,加不同年份均可
  • 时间增量:当前时间+25min、明天10:15PM、10:15+7天

在你使用at命令时,该作业会被提交到作业队列(job queue)。作业队列会保存通过at命令 提交的待处理的作业。针对不同优先级,存在26种不同的作业队列。作业队列通常用小写字母a~z 和大写字母A~Z来指代。

作业队列的字母排序越高,作业运行的优先级就越低(更高的nice值)。默认情况下,at的作业会被提交到a作业队列。如果想以更高优先级运行作业,可以用-q参数指定不同的队列字母。

2. 获取作业的输出:
当作业在Linux系统上运行时,显示器并不会关联到该作业。取而代之的是,Linux系统会将提交该作业的用户的电子邮件地址作为STDOUT和STDERR。任何发到STDOUT或STDERR的输出都 会通过邮件系统发送给该用户。

#!/bin/bash
echo "This script ran at $(date +%B%d,%T)"
echo
sleep 5
echo "This is the script's end..."

在这里插入图片描述
at命令利用sendmail应用程序来发送邮件。如 果你的系统中没有安装sendmail,那就无法获得任何输出!因此在使用at命令时,最好在脚本 中对STDOUT和STDERR进行重定向.

#!/bin/bash
echo "This script ran at $(date +%B%d,%T)" >> a.out
echo >> a.out
sleep 5
echo "This is the script's end..." >> a.out

3. 列出等待的作业:

atq命令可以查看系统中有哪些作业在等待
在这里插入图片描述

4. 删除作业:

arrm命令可以删除等待中的作业。

在这里插入图片描述

cron程序

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

1. cron时间表:

cron时间表采用一种特别的格式来指定作业何时运行。其格式如下:
min hour dayofmonth month dayofweek command

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

命令列表必须指定要运行的命令或脚本的全路径名。可以像在普通的命令行中那样,添加任何想要的命令行参数和重定向符号。
15 10 * * * /home/rich/test4.sh > test4out
cron程序会用提交作业的用户账户运行该脚本。因此,你必须有访问该命令和命令中指定的 输出文件的权限。

2. 构架cron时间表:

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

在这里插入图片描述
默认情况下,用户的cron时间表文件并不存在。要为cron时间表添加条目,可以用-e选项。 在添加条目时,crontab命令会启用一个文本编辑器,使用已有的cron时间表作为文件内容(或者是一个空文件,如果时间表不存在的话)。

3. 浏览cron目录:

如果你创建的脚本对精确的执行时间要求不高,用预配置的cron脚本目录会更方便。有4个基本目录:hourly、daily、monthly和weekly
在这里插入图片描述
因此,如果脚本需要每天运行一次,只要将脚本复制到daily目录,cron就会每天执行它。

4. anacron程序:
cron程序的唯一问题是它假定Linux系统是7×24小时运行的。除非将Linux当成服务器环境来运行,否则此假设未必成立。
如果anacron知道某个作业错过了执行时间,它会尽快运行该作业。这意味着如果Linux系统 关机了几天,当它再次开机时,原定在关机期间运行的作业会自动运行。
这个功能常用于进行常规日志维护的脚本。如果系统在脚本应该运行的时间刚好关机, 日志文件就不会被整理,可能会变很大。通过anacron,至少可以保证系统每次启动时整理日志文件。

anacron程序只会处理位于cron目录的程序,比如/etc/cron.monthly。它用时间戳来决定作业 是否在正确的计划间隔内运行了。每个cron目录都有个时间戳文件,该文件位于/var/spool/ anacron。
在这里插入图片描述
anacron程序使用自己的时间表(通常位于/etc/anacrontab)来检查作业目录。
在这里插入图片描述
anacron时间表的基本格式和cron时间表略有不同:
period delay identifier command

period条目定义了作业多久运行一次,以天为单位。anacron程序用此条目来检查作业的时间 戳文件。delay条目会指定系统启动后anacron程序需要等待多少分钟再开始运行错过的脚本。 command条目包含了run-parts程序和一个cron脚本目录名。run-parts程序负责运行目录中传给它的 任何脚本。
注意,anacron不会运行位于/etc/cron.hourly的脚本。这是因为anacron程序不会处理执行时间 需求小于一天的脚本。
identifier条目是一种特别的非空字符串,如cron-weekly。它用于唯一标识日志消息和错误 邮件中的作业。

Guess you like

Origin blog.csdn.net/cold___play/article/details/121239003