概述
计划将来的LINUX任务
使用at计划一次性任务
这不是单机工具,而是一个系统守护进程(atd),它有一组命令行工具可与守护进程(at、atq等)进行交互。默认自动安装及启用。atd守护进程可在at软件包中找到。
用户(包括root)可以使用命令行工具at为atd守护进程的作业排除。atd守护进程提供了a到z共26个队列,作业按字母顺序排列,队列越后,系统优先级越低。
计划作业
使用命令at<TIMESPEC>可以计划新作业。At随后会读取从stdin执行的命令。对于较大的命令以及错别字敏感的命令,使用来自脚本文件(比如at mow +5min <myscript>)的输入重定向比在终端窗口中手动输入所有命令要简单。手动输入命令时,按Ctrl+D来完成输入。
<TIMESPEC>允许许多强大的组合,使用户(几乎)可以自由地来说明应运行作业的确切时间。通常,这些组合以时间(如02:00pm、15:59甚至teatime)开头,后面接一个可选日期或将来的天数。
常用组合示例:
no +5min
teatime tomorrow (下午茶时间为16:00)
noon +4 days
5pm august 3 2016
检查和管理作业:使用命令atq或者别名at -l
输出内容包括:作业编号 该作业计划的日期和时间 作业所在的队列(a在第一行,h在第二行) 作业所有者(以及将运行作业的用户身份),所有行中都为student。
重要:普通的非特权用户只能查看和控制自己的作业。Root可以查看和管理所有作业。
检查在执行作业:at -c <JOBNUMBER>。该输出首先会显示所设置作业的环境,以便在用户创建作业时反映用户的环境,后跟将运行的实际命令。
删除作业:atrm <JOBNUMBER>将会删除计划的作业。当不再需要作业时(如远程防火墙配置成功且不需要重围时),这很有用。
参考:at(1) man page /usr/share/doc/at-*/timespec
配置文件:/var/spool/at
为将来的三分钟计划一个任务: # echo "date > ~/myjob" |at now +3min
检查计划在将来为用户执行的任务列表:# atq
等待作业运行,在作业从列表中消失前,重复运行atq,或者(如果只有一个待处理作业,可编写脚本):
# while [ $(atq | wc -l) -gt 0 ]; do sleep 1s; done
# cat myjob
使用g队列将作业计划为在明天16:00运行。该作业应创建新文件/home/student/tea。
# at -q g teatime tomorrow
at> touch /home/student/tea
at> Ctrl+D
使用b队列将作业计划为在明天16:05运行。该作业应创建新文件/home/student/cookies。
# at -q b 16:05 tomorrow
at> touch /home/student/cookies
at> Ctrl+D
检查待处理作业。也检查作业将运行的实际命令。
# atq
2 Tue Sep 12 16:00:00 2017 g root
3 Tue Sep 12 16:05:00 2017 b root
[root@desktop0 ~]# at -c 2
[root@desktop0 ~]# at -c 3
删除不需要的作业:[root@desktop0 ~]# atrm 2 //2为作业编号
echo “userdel -r student” |at 17:00 Thursday 下周四下午5点
# at 10:05
# at 10:05 2013-12-20
# at 10pm december 14
# at now +5 [minutes|hours|days|weeks]
计划任务授权——at任务控制
/etc/at.allow、/etc/at.deny
###############################################################################
使用cron计划周期性作业
cron计划任务 —— 提前计划好在固定的时间自动执行的运维任务
• 用途:提前设计,按照设置的时间间隔为用户反复执行某一项固定的系统任务
• 软件包:cronie、crontabs
• 系统服务:crond
• 日志文件:/var/log/cron
daemon,守护进程(系统服务) 【精灵、守护神】
[root@server0 ~]# tail /var/log/cron
Aug 19 13:30:01 localhost CROND[4380]: (root) CMD (/usr/lib64/sa/sa1 1 1)
crond守护进程默认开机自启。Crond是由多个配置文件和系统范围内的文件控制的,每个用户对应一个配置文件。这些配置文件使用户和管理员拥有细微的控制权,可以控制应执行周期性作业的确切时间。Crond守护进程作为cronie软件包的一部分安装。
如果从cron作业运行的命令向未重定向stdout或stderr生成任何输出,则crond守护进程将尝试使用系统中配置的邮件服务器将该输出通过电子邮件发送给拥有该作业的用户(除非被覆盖)。根据环境,这可能需要进行其他配置。
管理计划任务策略
• 使用 crontab 命令
– 编辑:crontab -e [-u 用户名]
– 查看:crontab -l [-u 用户名]
– 清除:crontab -r [-u 用户名]
crontab <filename> 删除所有作业,并替换为从<filename>读取的作业。如果未指定任何文件,则将使用stdin。
注意:root可以使用选项 -u <username>来管理其他用户的作业。不建议使用crontab命令来管理系统作业。
使用crontab -e 编辑作业时会调用vim进行编辑。正在编辑的文件每行均有一个作业。允许有空行,注释行以哈希符号(#)开头中的常见环境变量包括SHELL和MAILTO。设置SHELL变量将会更改用于在其下面的行中执行命令的shell,而设置MAILTO变量将会更改发送到的电子邮件地址输出。
重要:发送电子邮件可能需要另外配置本地邮件服务器或系统中的 SMTP转发。
编辑crontab任务格式: 分 时 日 月 周 任务命令行(绝对路径)
* * * * * 执行的命令或脚本程序
在表示各段的时间点时,除了明确的数值以外,还可以参考以下形式:
*:匹配范围内任意时间
,:分隔多个不连续的时间点
-:指定连续时间范围
/n:指定时间频率,每n ...
各个作业都包含6个字段,详述执行的时间和内容。如果前5个字段都与当前日期和时间相匹配,则会执行最后一个字段中的命令。
重要:*,代表该命令将在其中任一字段匹配时执行。
对于工作日,0和7都表示星期日,其余数字则与星期相对应。
*/x表示x的时间间隔,如*/7表示每7分钟运行一次作业。
可以使用3个字母的英文缩写表示月份和工作日,如Jan、Wed。
最后一个字段包含要执行的命令。如果尚未声明shell环境变量,则该命令将由/bin/sh执行。如果命令包含未转义的百分比符号(%),则%将被当作新行,且它之后的所有内容将反馈到stdin中的命令。
在什么时间(具体时刻、固定周期)执行什么操作?
每分钟记录当前系统的时间,写入到文本/opt/time.txt
[root@server0 ~]# which date #查询命令所对应的程序文件
[root@server0 ~]# date >> /opt/time.txt
[root@server0 ~]# cat /opt/time.txt
[root@server0 ~]# which date #查找命令对应程序位置,为了编辑cron任务使用
[root@server0 ~]# crontab -e -u root #以root身份写计划任务
* * * * * date >> /opt/time.txt #代表第一分钟都执行
或表示为*/1 * * * * /usr/bin/date >> /opt/time.txt
[root@server0 ~]# crontab -l -u root #查看root的计划任务
[root@server0 ~]# watch -n 1 cat /opt/time.txt
每一秒中运行cat /opt/time.txt命令
作业示例:
0 9 2 2 * /usr/local/bin/yearly_backup 在每年2月2日上午9点准点执行命令……。
*/7 9-16 * Jul 5 echo “Chime” 在7月每周五的9:00-16:59点间,每7分钟向该作业的所有者发送包含单词“Chime”的电子邮件。
58 23 * * 1-5 /usr/local/bin/daily_report 在每个工作日午夜前2分钟运行命令……。
0 9 * * 1-5 mutt -s “Checking in” boss@example.com % Hi there boss,just checking in. 在每个工作日(星期一到星期五)的上午9点整,使用mutt向boss@example.com发送邮件。
3 0 1 * 1 /sbin/dump 0uf /dev/ st0 /home 刚过每周一和每月一号的午夜之后
参考:crond(8)、crontab(1)和crontab(5) man page
############################################
案例4:配置一个cron任务
为用户 natasha 配置一个定时任务,具体要求如下:
每天在本地时间 14:23 执行
需要完成的任务操作为 /bin/echo hiya
步骤一:配置crontab任务记录
1)确保系统服务crond可用
[root@server0 ~]# systemctl restart crond
[root@server0 ~]# systemctl enable crond
2)为用户natasha添加计划任务
[root@server0 ~]# crontab -e -u natasha
23 14 * * * /bin/echo hiya
步骤二:检查任务是否执行
1)将系统日期时间临时调整到任务时间点前10秒左右
[root@server0 ~]# date -s '14:22:50' //设置
Sat Nov 26 14:22:50 CST 2016
[root@server0 ~]# date //确认日期时间
Sat Nov 26 14:22:55 CST 2016
2)等待10秒后查看/var/log/cron日志,应该会有执行记录
[root@server0 ~]# tail /var/log/cron
.. ..
Nov 26 14:23:02 localhost CROND[3818]: (natasha) CMD (/bin/echo hiya)
3)恢复系统日期时间
[root@server0 ~]# hwclock -s //重设为系统时钟
[root@server0 ~]# date //确认日期时间
Sat Nov 26 05:05:23 CST 2016
检查:
1)计划的任务有没有执行 —— 看日志 /var/log/cron
2)计划的任务执行结果怎么样 —— 看命令的完成结果
配置计划任务的注意事项:
1)任务操作是在后台执行的,屏幕显示看不到
2)任务操作命令、参数最好用绝对路径
– 检查执行记录(tail -5 /var/log/cron)
列出文档的末尾n行(缺省10)内容:tail -n 文档....
请思考:
1)添加一个每3天执行一次的计划任务操作,时间怎么表示?
0 0 */3 * * 任务操作
2)计划任务的时间表示为 05 8 13 * 5,对应的任务会在什么时候执行?
每周五的08:05 或者 每个月的13日的08:05
计划任务授权——crond任务控制
/etc/cron.allow、/etc/cron.deny
如果allow文件存在,则仅允许指定的用户
否则检查deny文件,除指定用户外其余都允许
如果两个文件都不存在,则只允许root使用
cron计划中断与补救
anacron延时补救
/etc/init.d/anacron
/etc/anacrontab
1 65 cron.daily run-parts /etc/cron.daily
1天 65分钟后
###############################################################################
计划系统cron作业
系统cron作业是在一组配置文件中配置的。这些配置文件之间的主要区别在于一个额外的字段,该字段位于星期几字段和命令字段之间,指定了作业应在哪个用户下运行。
/etc/crontab的随附注释中包含实用的语法图。
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
系统cron作业是在两个位置定义的:/etc/crontab和/etc/cron.d/*。安装cron作业的软件包应当通过在/etc/cron.d/中放置文件才能执行安装操作,管理员还可使用此位置来更轻松地将相关作业分到单个文件中,或者使用配置管理系统推送作业。
还有预定义作业每小时、每天、每周和每月运行一次,这些作业将分别执行位于/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/中的所有脚本。确保使置于这些目录中的所有脚本可执行。注意,这些目录包含可执行脚本,而不包含cron配置文件。
/etc/cron.hourly/*脚本是使用run-parts命令从/etc/cron.d/0hourly中定义的作业执行的。每日、每周和每月的作业也使用run-parts命令执行,但是从其他配置文件/etc/anacrontab执行。
/etc/anacrontab在RHEL7中由crond守护进程解析。该文件旨在确保重要的作业始终运行,且不会因为系统在应执行作业时关闭或休眠而意外跳过。
/etc/anacrontab的语法包含4个字段:
Period in days 每多少天应运行一次该作业。
Delay in minutes 在启动该作业前,cron守护进程应等待的时间。
Job identifier 在为/var/spool/anacron/中的文件的名称,该文件将用于检查该作业是否已运行。在cron从/etc/anacrontab启动作业时,它会更新此文件的时间戳。同一时间戳可用于检查作业上次运行的时间。
Connand 要执行的命令
/etc/anacrontab还包含使用语法NAME=value的环境变量声明。特别相关的是START_HOURS_RANGE:作业不会在此范围外启动。
参考:crond(8)、crontab(1)t crontab(5)、anacron(8)及anacrontab(5) man page
示例:一个每日作业用于计算活动用户数,及一个更新的cron作业用于收集系统性能数据。
[root@desktop0 ~]# vim /etc/cron.daily/usercount //创建新文件
#!/bin/bash
USERCOUNT=$(W -h | wc -l) //将用户活动数记录到系统日志
logger "There are currently ${USERCOUNT} active users"
使脚本可执行:
[root@desktop0 ~]# chmod +x /etc/cron.daily/usercount
Sysstat软件包在安装时有一个cron作业每隔10分钟运行一次,从而使用命令sal收集数据。确保已安装该软件包。
[root@desktop0 ~]# yum -y install sysstat
[root@desktop0 ~]# rpm -qc sysstat
/etc/cron.d/sysstat
/etc/sysconfig/sysstat
/etc/sysconfig/sysstat.ioconf
编辑/etc/cron.d/sysstat,将sal行中的*/10更改为*/5
[root@desktop0 ~]# vim /etc/cron.d/sysstat
*/5 * * * * root /usr/lib64/sa/sa1 1 1
监控日志文件,查看其大小和时间戳发生变化的时间。
[root@desktop0 ~]# watch ls -l /var/log/sa
最后
以上就是怡然火车为你收集整理的计划将来的LINUX任务的全部内容,希望文章能够帮你解决计划将来的LINUX任务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复