at是一次性计划任务,是安排某个任务在指定的时间允许一次执行。如果要周期执行就需要crontab了。
最重要的就是crontab里面时间的书写格式了
分钟小时 天 月 星期 脚本/命令 使用crontab -e编写计划任务只要将这几个部分填写好就可以了。
把具体的时间值填上,不知道的添加上*就可以了。
比如对一个数据库每天凌晨四点做一个备份,那么时间格式怎么写?
凌晨四点,那么是四点整,那么分钟这个位置的值就为0,小时是4,因为每天凌晨四点。没说是哪一天那么就写上*,也没说是几月份那么也写上*,也没说是星期几也写上*。
分钟小时 天 月星期
0 4 * * *
周二和周五的下午六点备份
分钟小时 天 月 星期
0 18 * * 2,5
逗号用来分隔不连续的值,表示每个星期二和星期五。
一月份到三月份,周二和周五的下午六点备份
分钟小时 天 月 星期
0 18 * 1-3 2,5
连续的值用横杠来分隔。
周一到周五,17:30分发一条广播通知用户马上关机,17:45分关机,这里就要分两步来写了。
分钟小时 天 月 星期 命令
30 17 * * 1-5 /user/bin/wall < /etc/issue通知的信息都写在这个文件里面
分钟小时 天 月 星期 命令
45 17 * * 1-5 /sbin/shutdown -h now或者init 5
每隔两分钟,中午12到下午两点,三月到6月和9月到12月,周一到周五,备份/etc目录。
分钟小时 天 月 星期 命令
*/2 12-14 * 3-6,9-12 1-5 /bin/cp -r /etc /backup/etc.20180117
*/2代表每隔两分钟,每隔一个小时在小时位置写上*/1。
在做计划任务的时候不是将这个命令写到这就行了,还得判断命令是否执行成功2> /backup/etc.bak.err
这样可以定期在backup下面可以查看/etc目录备份有没有成功。
/bin/cp -r /etc /backup/etc.20180117 2> /backup/etc.bak.err >/dev/null
正确的备份信息放到/dev/null伪设备里面,不显示在前台
同样和at一样,所写的计划任务会保存在/var/spool/cron下面。计划任务会以用户名来命名,这些都是计划任务产生的临时文件,计划任务执行完后这个文件会消失。
[[email protected] cron]# crontab -l
0 0 * * 1-5 wall < /test.txt
[[email protected] cron]# cd /var/spool/
[[email protected] spool]# ls
abrt abrt-upload anacron at cron cups lpd mail plymouth postfix
[[email protected] spool]# cd cron/
[[email protected] cron]# ls
root
[[email protected] cron]# cat root
0 0 * * 1-5 wall < /test.txt
如果有多个计划任务,不建议使用crontab -e删除,这样会将所有的计划任务删除。还是使用crontab -e来删除计划任务。
同样看看crond进程有没有启动,如果没有启动将其启动起来
[[email protected] cron]# ps -le | grep cron
4 S 0 1058 1 0 80 0 - 31563 hrtime ? 00:00:01 crond
[[email protected] cron]# /etc/rc.d/init.d/crond start
在/etc下面有crontab的配置文件。
[[email protected] cron]# vi /etc/crontab
在这里面有系统自己的计划任务。里面定义了一周执行的计划任务,一个月执行的计划任务。
[[email protected] cron]# ls -a /etc | grep cron
anacrontab
cron.d
cron.daily
cron.deny
cron.hourly
cron.monthly
crontab
cron.weekly
要想每天,你、每个星期,每个月自动的执行计划任务就可以在该文件里面定义。这样就不需要写crontab,直接将写好的计划任务丢到/etc/crontab里面就可以了。
进程处理的方式主要有三种,standalone就是这个服务启动起来以后,它的进程会在系统当中驻留占用系统的CPU和内存资源,在等待监听客户端的请求,一旦有客户端的请求马上就给出应答。Standalone的进程因为一直在监听所以占用的系统资源比较多,不管有没有客户端的访问,但是客户端在访问的时候相应的速度很快,比如Apache。
Xinetd,也就是说这个服务用的比较少,可以使用xinetd这个进程进行托管,[[email protected] cron]# ps -le | grep inetd可以查看xinetd的进程,通过[[email protected] cron]# ls /etc/xinetd.d/
可以查看到里面的服务对应一个配置文件,都是通过xinetd进行托管的。托管不像standalone一样一直在系统当中驻留占用资源来监听客户端的请求,而是xinetd在监听端口,一旦有客户端像这个端口发送请求,这个时候xinetd会检测到会启动来应答客户端的请求,应答完之后会终止这个进程。这样的好处就是不会在系统当中一直占用系统的资源,但是缺点就是响应速度可能慢一点,Telnet就是这种方式。
在选择的时候怎么选择standalone和xinetd,就是考察这个服务有没有大量的访问需要快速的应答。比如像apache,ngnix,web server往往需要standalone的,比如内部的FTP,访问量不大就可以使用xinetd,只要占用资源不多,对访问速度要求不高都可以使用xinetd。
在做计划任务的时候为什么不可以精确到秒,因为at,crond这个计划任务的进程和上面两种进程处理方式不一样,它们并不像standalone一样一直在后台监听客户端的请求,如果是这样时间就可以精确到秒了,同样不像xinetd一样有客户端请求才进行启动应答。atd,crond是每隔一分钟从休眠状态当中醒来,平时都在休眠,醒来之后在自己的计划任务列表里面查看有没有要执行的计划任务。有就执行,没有就继续休眠,因为一分钟醒来一次所以不能精确到秒。