linux计划任务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux计划任务相关的知识,希望对你有一定的参考价值。
本章架构:
1.什么是例行性工作调度
2.仅执行一次的工作调度
3.循环执行的例行性工作调度
4.可唤醒停机期间的工作任务
一、什么是例行性工作调度
两种工作调度的方式:
- 一种是例行性的,就是每隔一定的周期要来办的事项
- 一种是突发性的,就是这次做完以后就没有的哪一种
1.在Linux下面如何达到这两个功能呢。
1.at :at 是个可以处理仅执行一次就结束调度的指令,不过要执行 at 时, 必须要有 atd 这个服务 的支持才行。在 某些新版的 distributions 中,atd 可能默认并没有启动,那么 at 这个指令就会失效呢!不过我们的 CentOS 默认是启动的!
2.crontab :crontab 这个指令所设置的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。 crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服务喔!
2.Linux系统常见的例行性任务
二、执行一次的工作调度
1.调度服务at指令
at 的工作情况:
* 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
* 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;
* 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。
2.at选项与参数
首先来看如何设置一次性任务,命令格式为:at [HH:MM] [yyyy-mm-dd];
查看一次性任务计划的命令为:“ atq ”
删除一次性任务计划的命令格式为:“ atrm [任务编号]”
范例:再过五分钟后,将 /root/ .bashrc寄给 root 自己
三、循环执行的例行性工作调度
1.crontab 使用的限制数据有:
* /etc/cron.allow: 将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab;
* /etc/cron.deny: 将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。
* 以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这两个文件只选择一个 来限制而已,因此,建议你只要保留一个即可, 免得影响自己在设置上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你 可以将不想让他执行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个帐号一行!
2.crontab选项与参数:
其中 -u user为
编辑某个用户的cron,只用root可以使用此参数为别的用户设置cron服务。也可用于给用户指定crontab文件
范例
实例1:列出当前用户的定时任务
[22:30:17][dodmaster@mha3 ~]$ crontab -l
0 1 * * 1 $HOME/.DailyShell/hislogclear.sh
0 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/voice
20 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/data/
40 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/sms/
实例2:root用户编辑用户martin的定时任务
[22:30:17][root@mha3 ~]# crontab -u martin -e
实例3:为用户martin指定定时任务文件
[22:30:17][root@mha3 ~]# crontab -u martin martincron
以下内容说明了系统定时任务的具体书写格式:
实例1:每周末的凌晨一点钟执行一次系统的raid-check
0 1 * * Sun root /usr/sbin/raid-check
实例2:每天的4:02am分root用户执行/etc/cron.daily目录下的所有脚本,run-parts参数表示执行后面目录中的所有脚本。
02 4 * * * root run-parts /etc/cron.daily
实例3:每天的8-18每四小时,dodmaster用户执行hislogclear.sh脚本,即8:44,12:44,16:44,20:44四个时间点,会执行该脚本。
[21:57:56][dodmaster@mha3 ~]$ crontab -l
44 8-20/4 * * * $HOME/.DailyShell/hislogclear.sh
实例4:每五分钟执行一次
*/5 * * * * echo "every five minute to do it" >> time.txt
实例5:每个工作日下午八点执行
0 20 * * 1-5 echo "every workday 20:00 to do it" >> time.txt
四、可唤醒停机期间的工作任务
想像一个环境,你的 Linux 服务器有一个工作是需要在每周的星期天凌晨 2 点进行,但是很不巧的,星期六停电了~所以 你得要星期一才能进公司去启动服务器。 那么请问,这个星期天的工作调度还要不要进行?
因为你开机的时候已经是星期一,所以 星期天的工作当然不会被进行,对吧!
问题是,若是该工作非常重要 (例如例行备份), 所以其实你还是希望在下个星期天之前的某天还是进行一下比较好~ 那你该怎办?自己手动执行?
这时候就 得要靠 anacron 这个指令的功能了!这家伙可以主动帮你进行时间到了但却没有执行的调度喔!
1.什么是 anacron
- anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小时一直启动的 Linux 系 统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。
- 其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没有被执行,如果有超过期限的 工作在, 就执行该调度任务,执行完毕或无须执行任何调度时,anacron 就停止了。
anacron参数选项:
2.anacron 的执行流程 (以 cron.daily 为例):
- 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
- 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳记;
- 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;
- 若准备进行指令,根据 /etc/anacrontab 的设置,将延迟 5 分钟 + 3 小时 (看 START_HOURS_RANGE 的设置);
- 延迟时间过后,开始执行后续指令,亦即“ run-parts /etc/cron.daily ”这串指令;
- 执行完毕后, anacron 程序结束。
3.crond 与 anacron 的关系:
- crond 会主动去读取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等配置文件,并依据“分、时、日、月、周”的时间设置去各项工作调度;
- 根据 /etc/cron.d/0hourly 的设置,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的可执行文件;
- 因为 /etc/cron.hourly/0anacron 这个指令档的缘故,主动的每小时执行 anacron ,并调用 /etc/anacrontab 的配置文件;
- 根据 /etc/anacrontab 的设置,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的可执行文 件,以进行固定周期需要执行的指令。
也就是说,如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓 回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下,那么该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一 周,那么一开机后的数个小时内,该工作就会主动的被执行喔! 真的吗?因为 /etc/anacrontab 的定义啦!
注:基本上,crontab 与 at 都是“定时”去执行,过了时间就过了!不会重新来一遍~
那 anacron 则是“定期”去执行,某一段周期的执行 ~ 因此,两者可以并行,并不会互相冲突啦!
———————— 本文至此结束,感谢阅读 ————————
以上是关于linux计划任务的主要内容,如果未能解决你的问题,请参考以下文章