TangWei's Studio

Linux系统计划任务

Word count: 2,021 / Reading time: 8 min
2018/05/06 Share

一、同步服务器时间

在进行计划任务之前,一定要确保服务器的时间是准确无误的,否则将造成计划任务失败或者无法达到预期效果,尤其是在大规模的集群环境中,更显得尤为重要,所以我们首先要学会的就是同步服务器时间。

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
2
3
run level

chkconfig –list atd

如果服务未开启,请开启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)根用户能够修改其他用户的作业

CATALOG
  1. 1. 一、同步服务器时间
  2. 2. 二、执行一次性计划任务——at
    1. 2.1. 方法1:交互式
    2. 2.2. 方法2:输入重定向
    3. 2.3. 方法3:at -f 文件
    4. 2.4. at任务队列存放在/var/spool/at目录中,任务执行后消失。
    5. 2.5. at任务的黑名单(deny)、白名单(allow)文件:
  3. 3. 三、执行周期性的计划任务——crond
    1. 3.1. 第一种方法:修改/etc/crontab (rootonly)
    2. 3.2. 第二种方法:crontab命令创建
    3. 3.3. at和crontab对比: