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

【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进行重定向。

#!/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并不处理执行时间需求少于一天的脚本。


http://www.kler.cn/a/467332.html

相关文章:

  • iOS - Tagged Pointer
  • GPT分区 使用parted标准分区划分,以及相邻分区扩容
  • 【软考网工笔记】计算机基础理论与安全——网络安全
  • 我的创作纪念日——《惊变128天》
  • 力扣283 移动零
  • 贵州省贵安新区地图+全域数据arcgis格式shp数据矢量路网地名+卫星影像底图下载后内容测评
  • DNS分块矩阵的理解
  • 遇到复杂的 递归查询sql 需要oracle 转pgsql 可以把数据表结构给ai
  • 挑战春招找到java后端实习第三天(1.4)
  • C++语言编程————C++的输入与输出
  • --- UDP和TCP传输协议 ---
  • 5G NTN(七) 高层(1)
  • git submodule的使用:将别人的git仓库作为自己的子仓库
  • uniapp3 手写签名组件(vue3 语法)封装与应用
  • DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计
  • 《Android最全面试题-Offer直通车》目录
  • 喜报|富唯智能荣获暨2024年广州科技创新创业大赛二等奖
  • 3、蓝牙打印机按键 - GPIO输入控制
  • 【算法应用】基于麻雀搜索算法求解Renyi熵图像多阈值分割问题
  • 告别Kibana:Elasticsearch 桌面客户端的新变革
  • 基于STM32F103的语音控制模块的应用(实现语音控制小灯开关)
  • 机器学习之过采样和下采样调整不均衡样本的逻辑回归模型
  • 常见中间件漏洞(tomcat,weblogic,jboss,apache)
  • 【管道——二分+区间合并】
  • .Net加密与Java互通
  • Ubuntu静态IP地址