Linux系统计划任务

在生活、生产环境中,我们可能遇到这样的场景,想在某个时刻,或者固定某个时间周期的在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 指定一个用户

-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)根用户能够修改其他用户的作业

-------------本文结束感谢您的阅读-------------
0%