【Linux】定时运行shell脚本

1、at命令

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

at 的守护进程 atd 在后台运行,在作业队列中检查待运行的作业。

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

at [-f filename] time

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

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

at 命令能识别多种时间格式:

  • 标准的小时和分钟:11:25
  • AM/PM指示符:4:18 PM
  • 特定的时间名称:now、noon、midnight、teatime(4:00 p,m.)
  • 标准日期:MMDDYY、MM/DD/YY、DD.MM.YY
  • 文本日期:Feb 7、Sept 15;可加可不加年份
  • 时间增量:Now+25minutes、4:30 PM tomorrow、4:13 + 5 days

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

作业队列的字母排序越高,此队列中的作业运行优先级就越低(谦让度更大)。默认情况下,at 命令提交的作业会被放入a队列 。如果想降低优先级,可以使用**-q** 选项指定其他的队列,比如如果想少占用cpu时间,可以将其放入z队列。

获取作业的输出

默认情况下,Linux系统会将提交该作业的用户email作为STDOUT和STDERR,即通过邮件系统传给该用户。

但这种输出很不方便,尤其是未安装sendmail的情况下。故而可以在脚本中对STDOUT和STDERR进行重定向。

bash 复制代码
#!/bin/bash

outfile=$HOME/outfile.out

echo "此脚本会在$(date +%B%d,%T)运行" > outfile
echo >> outfile
echo "此脚本使用的是$SHELL shell." >> outfile
echo >> outfile
sleep 4
echo "脚本运行结束" >> outfile
exit

-M选项,禁止作业产生的输出信息。

查询等待中的作业

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

如下所示,atq命令列出了作业号,系统运行该作业的日期和时间,该作业所在的作业队列及用户账户名

删除作业

atrm 命令用于删除等待中的作业,通过指定作业号即可。只能删除自己的作业,不能删除其他人的作业(root用户除外)

2、cron程序

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

格式:

minutepasthour hourofday dayofmonth month dayofweek command

cron时间表允许使用特定值、取值范围(如1~7)或者通配符(星号*)来指定各个字段。

  • 20 7 * * * command:在每天的7:20执行command命令
  • 00 11 1 * * command:在每月第一天的中午11点执行命令。

设置在每月的最后一天执行:使用date命令检查明天的日期是不是某个月份的第一天(01)。

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

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

20 7 * * * /home/csb_user1/tesh.sh > backup.out

cron程序会以提交作业的用户身份运行该脚本,因此运行前得确认有访问该脚本以及输出文件的权限。

cron时间表

crontab -e:创建定时任务

crontab -l:列出当前用户下的全部定时任务

cron目录

如果定时任务对执行时间的精确性要求不高,可以使用预配置的cron脚本目录。预配置的基础目录共有4个:hourly、daily、monthly、weekly

如果脚本要每天都执行,则将脚本复制到daily目录下,cron就会每天运行它。

3、anacron程序

cron程序唯一的缺点是它假定Linux系统是7x24小时运行的。但如果某个作业在cron时间表中设置的运行时间已到,且此时Linux系统处于关闭状态,那么该作业就不会运行。当再次启动系统时,cron程序不会再去运行那些已错过的作业。

anacron程序判断出某个作业错过了设置的运行时间,它会尽快运行该作业。即使Linux系统关闭了几天,等再次启动时,原计划在关机期间运行的作业会自动运行。

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

anacron程序使用自己的时间表(/etc/anacrontab)来检查作业目录。

anacron时间表格式:

period delay identifier command

  1. period:定义了作业的运行频率(以天为最小单位)。anancron程序利用该字段检查作业的时间戳文件。
  2. delay:指定了在系统启动后,anacron程序需要等待多少分钟再开始运行错过的脚本。
  3. identifier:是一个特殊的非空字符串,如:cron.weekly。它唯一的作用是标识出现在日志消息和错误email中的作业。
  4. command:包含run-parts程序和一个cron脚本目录名。run-parts程序负责运行指定目录中的所有脚本。
    anacron不会运行位于/etc/cron.hourly目录的脚本,因为anacron并不处理执行时间需求少于一天的脚本。
相关推荐
春日见3 分钟前
控制算法:PP(纯跟踪)算法
linux·人工智能·驱动开发·算法·机器学习
HABuo26 分钟前
【Linux进程(四)】进程切换&环境变量深入剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
oMcLin41 分钟前
如何在 Rocky Linux 8.7 上通过 Prometheus 与 Grafana 结合,提升大规模容器环境的监控与性能分析?
linux·grafana·prometheus
橘颂TA42 分钟前
【Linux】死锁四条件的底层逻辑:从锁冲突到 STL 组件的线程安全实践(Ⅵ)
linux·运维·服务器·c++·死锁
埃伊蟹黄面44 分钟前
ELF深入解剖:从文件头到动态段,图解库的二进制构成
linux·c·
五仁火烧1 小时前
生产环境中配置了接口3000后,不能启动,改成8080后就可以
linux·网络·安全·vue
黄焖鸡能干四碗1 小时前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
JiMoKuangXiangQu1 小时前
Linux build:头文件安装
linux·headers_install
橙露1 小时前
国产PLC与进口PLC全面对比分析:技术、市场与未来趋势
运维·网络
lbb 小魔仙1 小时前
【Linux】云原生运维效率提升:Linux 终端工具链(kubectl + tmux + fzf)组合拳教程
linux·运维·云原生