Cron与At计划任务
问题引入
每个人或多或少都有一些约会或者是工作,有的工作是例行性的,例如每年一次的加薪、每个月一次的工作报告、每周一次的午餐会报、每天需要的打卡等等;有的工作则是临时发生的,例如刚好总公司有高官来访,需要你准备演讲器材等等!用在生活上面,例如每年的爱人的生日、每天的起床时间等等、还有突发性的计算机大降价等等啰。
这些工作都可以称为例行性命令,而这些工作Linux 也都可以帮您提醒,例如:每一天早上8:00 钟要服务器连接上音响,并启动音乐来唤你起床;而中午12:00 希望Linux 可以发一封信到你的邮件信箱,提醒你可以去吃午餐了;另外,在每年的你爱人的生日的前一天,先发封信提醒你,以免忘记这么重要的一天。
从上面的说明当中可以很清楚的发现两种计划任务的方式:
一种是例行性的,就是每隔一定的周期要来办的事项;
一种是突发性的,就是这次做完以后就没有的那一种(计算机大降价....)
at :这个工作仅执行一次就从Linux 系统中的计划任务中取消 (突发性)
cron:这个工作将持续例行性的作下去 (例行性)
仅仅进行一次的计划任务:at
我们首先做的是开启服务,并设定一下开机时就启动。
![](https://i-blog.csdnimg.cn/blog_migrate/d4af6aebecdece5200b398dfc50dd167.png)
我们需要对at进行一些使用上的限制
利用
/etc/at.allow与/etc/at.deny这两个档案来进行at 的使用限制,加上这两个档案后,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.deny这个档案存在就好了,因为我们假设系统内的账号都是懂得操作的使用者,因此,预设让他们可以任意使用at 这个好用的东西!这也是系统的默认值。
at 语法
-m : 当at的工作完成之后,即使没有输出信息,亦以email通知使用者该工作已经完成
-l : at -l 就是相当于atq ,列出目前系统上面所有该使用者的at排程
-d : 相当于atrm ,可以取消一个在at排程上面的工作。
-v : 可是使用较为明显的时间格式列出at排程中的工作列表
-c : 可是列出后面接的该项工作的实际命令内容。
实例 :
![](https://i-blog.csdnimg.cn/blog_migrate/241b7b2494b2173166d4ed6aa727e3e1.png)
如图中所示:我们创建了一个at计划任务,当现在的一分钟之后,把nihao输出到/home/wangkai/files中
立即查看,发现任务未执行
等待一分钟,发现任务已经执行。(tail动态显示)
atq 和 atrm
atq:查询当下有多少计划任务
atrm[jobnumber]:对任务进行删除
![](https://i-blog.csdnimg.cn/blog_migrate/464bcdda944ef192fe5add0407bd803f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/41e616c3fbf535141b8256212b769e51.png)
Crontab
相对于at 是仅执行一次的工作,循环执行的例行性命令则是由cron(crond) 这个系统服务来控制的。
由于系统预设就有相当多的例行性工作,因此,这个系统服务是预设启动的。另外,由于使用者自己也可以进行例行性工作排程,所以,Linux 也提供使用者控制例行性命令的指令(crontab)。
如同at命令一样,crontab在使用过程中会有很多的限制
/etc/cron.allow:
将可以使用crontab的账号写入其中,若不在这个档案内的使用者则不可使用crontab;
/etc/cron.deny:
将不可以使用crontab的账号写入其中,若未记录到这个档案当中的使用者,就可以使用crontab。
一般来说,系统预设是保留/etc/cron.deny,您可以将不想让他执行crontab的那个使用者写入/etc/cron.deny当中,一个账号一行!
crontab语法
-u : 只有root 才能进行这个任务,也可以帮助其他使用者建立或者移除crontab
-e : 编辑crontab的内容
-l : 查阅crontab的工作内容
-r : 移除crontab的工作内容
![](https://i-blog.csdnimg.cn/blog_migrate/efe96b10367c0ccceae73817436c1c6f.png)
部分特殊字符的含义
![](https://i-blog.csdnimg.cn/blog_migrate/04a32839f8fa6d634bd447523d6e2143.png)
![](https://i-blog.csdnimg.cn/blog_migrate/71ecdde333e6bf7ad841d28729653a24.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0e526489c368d2debd6efb0b2464523d.png)
我们设置了一个练习
将ping 命令的输出结果显示到 /home/wangkai/1.txt中去
![](https://i-blog.csdnimg.cn/blog_migrate/9d6f86d51b5f92fe14b6de503513156b.png)
显示结果如图所示
![](https://i-blog.csdnimg.cn/blog_migrate/bd6bf1c52669841256fcc3c2359f00f5.png)
绝对路径
如果脚本都设置正确,在本地尝试可以执行,但是加入到crontab中不能执行,可以在脚本加入环境配置命令
if[-f"$HOME/.bashrc"]
then
."$HOME/.bashrc"
fi
Crontab不执行问题总结
1 crond服务未启动
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是启动服务:
/etc/init.d/crondrestart
2 权限问题
比如:脚本没有x执行权限,解决方法:
增加执行权限,或者用bash abc.sh的方法执行
3 路径问题
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行
./test.sh
就可以了。但是在crontab中,就会找不到这个脚本,需要写完整/root/test.sh
系统的配置文件:/etc/crontab
1,这个『crontab-e 』是针对使用者的cron来设计的,如果是『系统的例行性任务』时,该怎么办呢?是否还是需要以crontab-e 来管理你的例行性计划任务呢?当然不需要,你只要辑/etc/crontab即可。
2,注意:crontab-e 这个crontab其实是/usr/bin/crontab这个运行档,而/etc/crontab可是一个纯文本文件,你可以root 的身份编辑一下这个文件。
3,cron这个服务的最低侦测限制是分钟,所以『cron会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容』,因此,只要你编辑完/etc/crontab这个文件,并且将他储存之后,那么cron的配置就自动的会来运行了。
注意:修改完/etc/crontab之后,可能并不会马上运行,这个时候请重新启动crond这个服务,『/etc/init.d/crondrestart』
![](https://i-blog.csdnimg.cn/blog_migrate/c2796fa473dd180e0e29e870bb4d5a6b.png)
让我们以ppt上的为例
![](https://i-blog.csdnimg.cn/blog_migrate/6dcf531811164762b956ed22c8fe6db9.png)
01 * * * * root run-parts /etc/cron.hourly:
这个/etc/crontab里面预配置义出四项工作任务,分别是每小时、每天、每周及每个月分别进行一次的工作!但是在五个栏位后面接的并不是命令,而是一个新的栏位,那就是『运行后面那串命令的身份』。这与使用者的crontab-e 不相同。由于使用者自己的crontab并不需要指定身份,但/etc/crontab里面要指定身份!以上表的内容来说,系统默认的例行性工作是以root 的身份来进行的。run-parts 是一个bash script ,会将后面接的『目录』内的所有文件拿出来运行,也就是说
『如果你想让系统每小时主动帮你运行某个命令,将该命令写成script,并将该文件放置到/etc/cron.hourly/ 目录下即可』
也就是你把写好的脚本放到类似域cron.hourly这样的目录下。就可以运行。
其实/etc/crontab这个文件里面支持两种下达命令的方式:
一种是直接下达命令
一种则是以目录来规划
命令型态
01 * * * * s mail -s “testing” kiki< /home/dmtsai/test.txt以s 这个使用者的身份,在每小时运行一次mail 命令。
目录规划
*/5 * * * * root run-parts /root/runcron创建一个/root/runcron的目录,将要每隔五分钟运行的『可运行档』都写到该目录下,就可以让系统每五分钟运行一次该目录下的所有可运行档。
资源分配不均的问题
当大量使用crontab的时候,总是会有问题发生的,最严重的问题就是『系统资源分配不均』的问题,比如有侦测主机流量的需求,包括:
•流量
•区域内其他PC 的流量侦测
•CPU 使用率
•RAM 使用率
•线上人数即时侦测
如果每个流程都在同一个时间启动的话,那么在某个时段时,系统会变的相当的繁忙,所以,这个时候就必须要分别配置:
![](https://i-blog.csdnimg.cn/blog_migrate/e97d4f304a835c35c24b9c4349f399d9.png)
取消不要的输出项目
当有运行成果或者是运行的项目中有输出的数据时,该数据将会mail 给MAILTO 配置的帐号。
那么当有一个排程一直出错(例如DNS 的侦测系统当中,若DNS 上一级主机挂掉,那么你就会一直收到错误信息!)怎么办?
数据流重导向,直接以『命令重导向』将输出的结果输到/dev/null这个垃圾桶当中就好了!