计划任务
Posted ericz2j
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计划任务相关的知识,希望对你有一定的参考价值。
(整理自《鸟哥的Linux私房菜》基础篇)
1.两种计划任务的方式
• 一种是例行性的,就是每隔一定的周期要来办的事项;
• 一种是突发性的,就是这次做完以后就没有的那一种
at :at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务 的支援才行
crontab :crontab 这个指令所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服务。
2.仅执行一次的计划任务
2.1atd 的启动与 at 运作的方式
要使用单一工作排程时,我们的 Linux 系统上面必须要有负责这个排程的服务,那就是 atd 这个玩意儿。 不过并非所有的 Linux distributions 都预设会把他打开的,所以呢,某些时刻我们必须要手动将他启用才行。 启用的方法很简单,就是这样:
重点就是要看到上表中的特殊字体,包括『 enabled 』以及『 running 』时,这才是 atd 真的有在运作的意思.
事实上,我们使用 at 这个指令来产生所要运作的工作,并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了。
at 的工作情况其实是这样的:
1. 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
2. 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;
3. 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。
万一我下达了 at 之后,才发现指令输入错误,该如何是好?就将他移除啊!利用 atq 与 atrm 。
2.2 batch:系统有空时才进行计划任务
batch 神奇的地方在于:他会在 CPU 的工作负载小于 0.8 的时候,才进行你所下达的工作任务。
使用 uptime 可以观察到 1, 5, 15 分钟的『平均工作负载』量,因为是平均值,所以当我们如上表删除掉四个工作后,工作负载不会立即降低, 需要一小段时间让这个 1 分钟平均值慢慢回复到接近 0 啊!当小于 0.8 之后的『整分钟时间』时,atd 就会将 batch 的工作执行掉。
3.循环执行的例行性计划任务
循环执行的例行性工作排程则是由 cron (crond) 这个系统服务来控制。
3.1使用者的设定
• /etc/cron.allow:
将可以使用 crontab 的账号写入其中,若不在这个文件内的使用者则不可使用 crontab;
• /etc/cron.deny:
将不可以使用 crontab 的账号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。同样的,以优先级来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可, 一般来说,系统默认是保留 /etc/cron.deny.
crontab 的语法:
预设情况下,任何使用者只要不被列入 /etc/cron.deny 当中,那么他就可以直接下达『 crontab -e 』去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入 vi 的编辑画面, 然后以一个工作一行来编辑,编辑完毕之后输入『 :wq 』储存后离开 vi 就可以了! 而每项工作 (每行) 的格式都是具有六个字段,这六个字段的意义为:
代表意义 |
分钟 |
小时 |
日期 |
月份 |
周 |
指令 |
数字范围 |
0-59 |
0-23 |
1-31 |
1-12 |
0-7 |
呀就指令啊 |
比较有趣的是那个『周』!周的数字为 0 或 7 时,都代表『星期天』的意思!另外,还有一些辅助的字符,大概有底下这些:
特殊字符 |
代表意义 |
*(星号) |
代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表着『不论何月、何日的礼拜几的 12:00 都执行后续指令』的意思! |
,(逗号) |
代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是: 0 3,6 * * * command 时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用! |
-(减号) |
代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作: 20 8-12 * * * command 仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思! |
/n(斜线) |
那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则: */5 * * * * command 很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思! |
如何查询使用者目前的 crontab 内容呢?我们可以这样来看看:
3.2系统的配置文件: /etc/crontab, /etc/cron.d/*
cron 这个服务的最低侦测限制是『分钟』,所以 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 .
我们来看一下这个 /etc/crontab 的内容:
这个文件与将刚刚我们下达 crontab -e 的内容几乎完全一模一样!只是有几个地方不太相同:
o MAILTO=root:
当 /etc/crontab 这个文件中的例行性工作的指令发生错误时,或者是该工作的执行结果有 STDOUT/STDERR 时,默认会将错误讯息或者是屏幕显示的讯息由系统
直接寄发一封 mail 给 root。
o PATH=....:
就是输入执行文件的搜寻路径!使用默认的路径设定就已经很足够了!
o 『分 时 日 月 周 身份 指令』七个字段的设定
这个 /etc/crontab 里面可以设定的基本语法与 crontab -e 不太相同!前面同样是分、时、日、月、周五个字段, 但是在五个字段后面接的并不是指令,而是一个新的字段,那就是『执行后面那串指令的身份』为何!这与使用者的 crontab -e 不相同。由于使用者自己的 crontab 并不需要指定身份,但 /etc/crontab 里面当然要指定身份!以上表的内容来说,系统默认的例行性工作是以 root 的身份来进行的。
3.3crond 服务读取配置文件的位置
一般来说,crond 预设有三个地方会有执行脚本配置文件,他们分别是:
• /etc/crontab
• /etc/cron.d/*
• /var/spool/cron/*
最后,让我们总结一下:
• 个人化的行为使用『 crontab -e 』:如果你是依据个人需求来建立的例行工作排程,建议直接使用 crontab -e 来建立你的工作排程较佳! 这样也能保障你的指令行为不会被大家看到 (/etc/crontab 是大家都能读取的权限喔!);
• 系统维护管理使用『 vim /etc/crontab 』:如果你这个例行工作排程是系统的重要工作,为了让自己管理方便,同时容易追踪,建议直接写入 /etc/crontab 较佳!
• 自己开发软件使用『 vim /etc/cron.d/newfile 』:如果你是想要自己开发软件,那当然最好就是使用全新的配置文件,并且放置于 /etc/cron.d/ 目录内即可。
• 固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到 /etc/crontab 中来集中管理较好。 如果想要偷懒,或者是一定要再某个周期内进行的任务,也可以放置到上面谈到的几个目录中,直接写入指令即可!
4. 注意事项
周与日月不可同时并存:
你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作』。比如:
本来你以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了。
5.可唤醒停机期间的工作任务
使用 anacron命令,语法:
以上是关于计划任务的主要内容,如果未能解决你的问题,请参考以下文章