Linux系统计划任务

在生活、生产环境中,我们可能遇到这样的场景,想在某个时刻,或者固定某个时间周期的在Linux系统中执行某项任务,例如,定时关机,定期自动清理垃圾文件等,at,crontab等命令就是帮你实现这样功能的。

本节索引:

一、同步服务器时间

二、执行一次性计划任务——   at

三、执行周期性计划任务—— crond

0037037011239850_b

 

在生活、生产环境中,我们可能遇到这样的场景,想在某个时刻,或者固定某个时间周期的在Linux系统中

执行某项任务,例如,定时关机,定期自动清理垃圾文件等,at,crontab等命令就是帮你实现这样功能

的。

 

一、同步服务器时间

在进行计划任务之前,一定要确保服务器的时间是准确无误的,否则将造成计划任务失败或者无法达到

预期效果,尤其是在大规模的集群环境中,更显得尤为重要,所以我们首先要学会的就是同步服务器时

间。

CentOS6:

ntpdata 172.x.x.x                            将时间与服务器同步

vim /etc/ntp.conf                           修改此文件

server 172.x.x.x iburst                  加上此行

chkconfig ntpd on                           下次启动自动打开ntpd服务

service ntpd start                           打开ntpd服务

service ntpd status                        检查ntpd服务状态

 

CentOS7:

ntpdata 172.x.x.x                            将时间与服务器时间同步

vim /etc/chrony.conf                     修改此文件

server 172.x.x.x iburst                   加上此行

systemctl enable chronyd              下次启动自动打开chronyd服务

systemctl start chronyd                 打开chronyd服务

systemctl status chronyd               检查chronyd服务状态

 

至此,服务器时间同步就算是完成了!

 

二、执行一次性计划任务——at

Linux任务计划、周期性任务执行

未来的某时间点执行一次任务

   at

batch:系统自行选择空闲时间去执行此处指定的任务

周期性运行某任务

   cron

 

 

使用at命令前,先确认at服务是否处于运行状态

Centos6:

确认当前运行级别处于on状态

run level

chkconfig –list atd

如果服务未开启,请开启atd服务

service atd start              

 

centos7:

确认处于active(running)状态

systemctl status atd

如果服务未开启,请开启atd服务

systemctl start atd

 

at

格式:at [options] TIME   最后Ctrl+d结束输出

options:

-l      显示所有计划任务列表,同atq命令

-d #  删除第#个计划任务,同atrm命令

-c #  查看具体作用任务

-m    强制发邮件

-f /path/from/somefile  草丛指定文件中读取任务

TIME:

HH:MM [YYYY-mm-dd]

noon,midnight,teatime (4pm)

tomorrow

now+#{minute,hours,days,weeks}

 

HH:MM  02:00

  在今日HH:MM进行,若该时刻已过,则明天此时执行任务

HH:MM YYYY-mm-dd

  规定在某年某月某一天的某时刻执行任务

HH:MM[am|pm][month][date]

04pm March 17

17:20 tomorrow

HH:MM[am|pm]+number[minutes|hours|days|weeks]

在某个时间点再加几个时间后才执行任务

now + 5minutes

02pm + 3days

 

注意:计划任务中的标准输出不显示在终端,将会以邮件方式发送至邮箱,所以执行计划任务最好

将标准输出全部重定向到/dev/null,否则会产生大量垃圾邮件

 

at执行方式:

方法1:交互式

例:at

at 15:00  创建一个15:00的计划任务

poweroff                  输入计划命令

Ctrl+d               结束输出

方法2:输入重定向

例:at 18:00 << EOF

shutdown

EOF

方法3:at -f 文件

例:echo “hello” > /data/f1

at 19:00 -f /data/f1

 

at任务队列存放在/var/spool/at目录中,任务执行后消失。

 

at任务的黑名单(deny)、白名单(allow)文件:

系统默认只有黑名单文件/etc/at.deny,没有白名单文件/etc/at.allow

/etc/at.deny    黑名单文件,放入文件中的用户将不能执行at任务计划

/etc/at.allow  白名单文件,当白名单文件存在时,只有白名单中的用户才能使用at。

白名单文件需手动创建,优先级高于黑名单

如果黑、白名单文件包含同一用户,将优先看白名单,可以使用at计划任务

如果黑、白名单文件都删除,将只有root账号可以使用at计划任务。

 

 

三、执行周期性的计划任务——crond

使用crond周期任务计划前,先确认crond服务是否处于运行状态

Centos6:

确认处于active(running)状态

service crond status         

如果服务未开启,请开启crond服务

service crond start        

 

centos7:

确认处于active(running)状态

systemctl status crond

如果服务未开启,请开启crond服务

systemctl start crond     

 

相关文件:

/etc/crontab          系统周期性任务计划文件(root only)

/var/spool/cron/         给用户创建周期计划的目录

/etc/cron.d/           给存储系统创建周期计划的目录

 

/var/log/cron          日志文件,可利用日志中的信息恢复误操作内容

 

注意:

(1)在/etc/crontab/etc/cron.d/的文件中刚创建周期计划任务时,需要比普通用户周期计划目

录的格式多添加一个用户名,位于时间和命令之间。

(2)周期计划任务中的标准输出不显示在终端,将会以邮件方式发送至邮箱,所以执行计划任务建议

将标准输出全部重定向到/dev/null,否则会产生大量垃圾邮件

 

crontab

格式:

crontab [options] file

crontab [options]

 

options:

-u <user>       指定一个用户

-e           创建计划任务

-l             列出计划任务列表

-r            删除计划任务

-i             删除前进行交互式提示

 

例:

crontab -l -u wang      查看wang用户的计划任务

crontab -r -u wang     删除wang用户的计划任务

 

crontab计划任务同at命令一样,也有自己的黑、白名单文件,并且他们的作用是相类似的:

/etc/cron.deny    黑名单文件,放入文件中的用户将不能执行周期任务计划

/etc/cron.allow      白名单文件,只有白名单中的用户才能使用cron,需手动创建,优先级高于黑名单

如果黑、白名单文件都删除,将只有root账号可以使用周期计划任务。

 

创建周期任务的两种方法:

第一种方法:修改/etc/crontab  (rootonly)

/etc/crontab 计划任务参考格式

# 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

*表示每次都执行

*/10表示每10分钟执行一次

 

例如:

# run five minutes after midnight, every day

每五分钟执行一次:

5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1

 

# run at 2:15pm on the first of every month — output mailed to paul

每个月第一天的14:15分执行一次,并发送邮件

15 14 1 * *     $HOME/bin/monthly

 

# run at 10 pm on weekdays, annoy Joe

每个工作日晚上22:00,发送邮件给Joe

0 22 * * 1-5    mail -s “It’s 10pm” joe%Joe,%%Where are your kids?%

 

每间隔2小时的23分钟,打印一次,am0:23,am2:23,am4:23…,每天

23 0-23/2 * * * echo “run 23 minutes after midn, 2am, 4am …, everyday”

 

每个星期日的04:05,打印一次

5 4 * * sun     echo “run at 5 after 4 every sunday”

 

注意:

30 4 1,15 * 5     表示每月1,15日加每周五执行,或关系

若想执行且关系,加脚本判断

 

特殊的时间格式:

这些特殊的时间规范可以用来代替一些时段和日期,用@字符作为前缀

@reboot         Run once after reboot   下次启动会执行,包括poweroff

@yearly          0 0 1 1 *           每年执行一次

@annually      0 0 1 1 *           每年执行一次

@monthly      0 0 1 * *           每月执行一次

@weekly        0 0 * * 0           每周执行一次

@daily             0 0 * * *           每天执行一次

@hourly          0 * * * *           每小时执行一次

 

 

 

第二种方法:crontab命令创建

crontab -e       将以vi打开一个空白文件

# 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

# |  |  |  |  |

# *  *  *  *  *   command to be executed

不需写用户名,将以当前用户执行周期计划任务

创建成功后周期计划文件自动放入/var/spool/cron目录

 

at和crontab对比:

一次性作业使用at

重复性作业使用crontab

at                       crontab

创建任务:    at time                  crontab -e

任务列表:    at -l                       crontab -l

查看信息:    at -c #                    N/A

删除任务:    at -d #                  crontab -r

修改任务:     N/A                     crontab -e

 

注意:(1)默认不显示标准输出和标准错误,会以邮件方式邮寄给用户

a.COMMAND > /dev/null

b.COMMAND &> /dev/null

(2)根用户能够修改其他用户的作业

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/97641

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班