一、同步服务器时间
在进行计划任务之前,一定要确保服务器的时间是准确无误的,否则将造成计划任务失败或者无法达到预期效果,尤其是在大规模的集群环境中,更显得尤为重要,所以我们首先要学会的就是同步服务器时间。
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状态
1 | run level |
如果服务未开启,请开启atd服务
1 | service atd start |
centos7:
确认处于active(running)状态
1 | systemctl status atd |
如果服务未开启,请开启atd服务
1 | 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)状态
1 | service crond status |
如果服务未开启,请开启crond服务
1 | service crond start |
centos7:
确认处于active(running)状态
1 | systemctl status crond |
如果服务未开启,请开启crond服务
1 | 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
指定一个用户 -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)根用户能够修改其他用户的作业