目录

一次性任务计划

系统默认未安装此工具。

语法:at data_time

yum -y install atd

#光安装完不行还得启动服务
systemctl start atd #启动服务
systemctl enable atd #开机自启
systemctl status atd #查看服务状态

时间日期写法:

#绝对时间
HH:MM:具体时间点
DD.MM.YYYY:天.月.年
YYYY-MM-DD:年-月-日
MM/DD/YY:月/日/年
HH:MM YYYY-MM-DD:时:分 年-月-日

#相对时间
at now+3minutes(min也行):从任务计划创建开始计时,3分钟以后执行

选项。

  • -l,显示 at 任务列表,等同于 atq。
  • -d,删除指定编号 at 任务,等同于 atrm。
  • -c,显示指定编号 at 任务执行的命令。
  • -f,读取指定文件中任务,避免在命令行交互。

例子

[root@gbb ~]# at time
at> command #写下你要操作的命令(有多条写完直接回车继续写),ctrl+d 保存退出。

如果你发现,输错要执行的命令怎么都删不掉,可以试试 Ctrl+Backspace

设置 at 任务后在 /var/spool/at/ 目录下目录生成一个脚本文件,用选项查看就是这里脚本文件。

计划执行结果会以 mail 发送给执行at的用户(软件包名是:mailx),直接输入 mail 命令查看邮件列表,之后可以输入 mail_id 查看指定邮件 ,查看完成后用 q 退出。

如果你发现没有邮件,那可能是 mail 服务出现了问题,可以查看一下本地环回地址 25 号端口有没监听。

at 命令不是谁都可以执行的,在 /etc 目录中有 at.allow 与 at.deny 两文件(允许与拒绝),at.allow 是除了文件中的用户外谁也不能用,at.deny 存在表示文件内的用户名被拉黑(使用方法是在文件中写上用户名重启服务就能生效),如果目录下两个文件不存在就只能 root 执行 at 命令。

batch:CPU 空闲执行计划,负载 <0.8 才执行 batch 中的任务,uptime 查看 CPU 平均负载。直接输入 batch 后面就是你要执行的命令,貌似不能指定时间,at 够用,等需要用到时再折腾。

周期性任务计划

系统周期性任务:每隔一段时间自动执行,比如日志轮换(logrotate)、登录文件分析(logwatch)、locate 数据库更新(updatedb)、man 数据库更新(mandb/makewathis)、rpm 软件登录文件创建、网络相关分析行为,自动清空 tmp 目录。

用户周期性任务:自己每隔多长时间自动去执行某些操作。

要想任务能够成功执行需要启动服务。

systemctl start crond #启动服务
systemctl enable crond #开机自启
systemctl status crond #查看服务状态

语法:crontab options

选项。

  • -e,增加或编辑一个 cron 任务内容
  • -u,为指定用户设置 cron 任务计划(root 才能使用)
  • -l,查看 cron 任务列表
  • -r,清空整个 cron 列表。如果想删除某一条,-e 进入去删或者注释。
  • -i,在清空任务时,提示是否要清清空。

它和 crontab 一样,不过设置日期的格式不同。这是说,每月 1 号零点去压缩 upload 目录内容,它格式有两种方式,如下。

  • 用户设置:分 时 日 月 周 用户 命令 #指定某个用户与运行
  • 系统设置:分 时 日 月 周 命令 #默认root用户

使用 -e 会自动打开一个临时文件,和编辑文本一样去操作。

[root@gbb ~]# crontab -e
00 0 1 * * zip -r /root/upload.zip /usr/local/nginx/upload

别直接编辑这个配置文件,因为它不会告诉你语法错误,别骚,除非你是神仙。另外 crontab 不像 at 给计划加上了执行命令加上了环境(at -c 中前半部分),可能部分命令在未登录情况下不能执行,建议给命令加上绝对路径(参见下文 crontab 配置文件中 PATH)。

写命令时有 %,需要对它转义,也可放入单引号中。。

具体的日期范围:

时间单位范围值
minute0 - 59
hour0 - 23
day of month1 - 31
month1 - 12
day of week0 - 6(Sunday=0 or 7)

通配符 * 定义任意时间。

10 17 * * * cat /etc/fstab #每天下午五点十分去执行命令
10 * * * * cat /etc/fstab #每小时的第十分去执行命令,01:10,02:10,每个小时去执行。
* * * * * cat /etc/fstab #每分钟去执行
10 17 * * 0 cat /etc/fstab #每周日下午五点十分执行。
10 17 11 * * cat /etc/fstab #每月7号下午五点十分执行。
10 17 20 3 * cat /etc/fstab #每年3月20号下午五点十分执行。

逗号 , 定义定义离散时间段。

5,15,30,45,56 17 * * * cat /etc/fstab #每天五点5,15,30,45,56来执行命令
0 15,20 * * 3,0 #每周三周日下午三点和八点整执行。
* 15,20 * * 3,0 #分钟位置*代表每分钟执行。

中横线 - 定义连续时间段。

00 23 * * 1-5 cat /etc/fstab #每周一到周五晚上十一点执行命令。
0 9-18 * * 1-5 cat /etc/fstab #每周一到周五9-18每小时执行。

*/n 定义间隔时间段。其中 n 是步长。

*/5 * * * * cat /etc/fstab #每五分钟执行
00 10 */5 * * cat /etc/fstab #每隔五天的十点整执行
*/7 * * * * cat /etc/fstab #每7分钟执行?当步长不能被整除,这个计划就不会执行。

指定日期时 day of week 和 day of month 最好不要一起用,因为无法保证那一天一定是周几。

配置文件

文件解释
/var/spool/cron用户cron任务计划配置文件
/etc/crontabcron配置文件
/etc/cron.allow允许哪些用户使用此命令
/etc/cron.deny拒绝哪些用户使用此命令(默认存在)
/etc/cron.dcron辅助配置文件目录

Linux 用户设置完 cron 任务后,会在 /var/spool/cron 目录下生成和用户同名的 cron 文件。执行成功后会发一封 Email 到用户中,要是执行任务比较频繁每次发送邮件会充满屏幕,这时可以把成功结果重定向到 /dev/null ,做法是在要执行命令后面加上 command > dev/null

/etc/crontab

SHELL=/bin/bash #用什么shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #corntab执行命令去哪个目录中找
MAILTO=root #收取邮件的用户

# For details see man 4 crontabs  #查看更多细节用 man 4 crontabs

# 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 #user-name是系统用户可以指定一个用户,command to be executed 是你要执行的命令。

/etc/cron.d

目录内 0hourly 文件内容是每小时执行的任务。

/etc/cron.hourly:cron工具去执行
/etc/cron.daily,/etc/cron.weekly,cron.monthly 是 anacron 工具去执行

anacron

当 cron 任务异常未执行,anacron 会重新去执行 cron 任务。

语法:anacron [options] [job]

选项。

  • -s,依据时间记录文件去判断是否执行
  • -f,强制执行
  • -n,立刻运行未执行的任务,不需要延时

anacrontab 配置文件

对 /etc/anacrontab 配置文件解释。

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh #使用的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin  #命令的位置
MAILTO=root #执行成功mail发给谁
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45  #随机延迟(分钟)
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22 #开始延迟范围(小时)

#period in days   delay in minutes   job-identifier   command
1    5    cron.daily        nice run-parts /etc/cron.daily
7    25    cron.weekly        nice run-parts /etc/cron.weekly
@monthly 45    cron.monthly        nice run-parts /etc/cron.monthly

对配置文件其中一句进行解释。

这一段的意思是,一天内没执行,5 分钟后立马执行后面的命令。1 是日期,5 是延迟几分钟去执行(要加上 anacrontab 配置文件中随机延迟范围的 3—22 小时),cron.daily 标明了是什么类型的任务,这一句是以天为单位的任务,nice run-parts /etc/cron.daily 是将要执行的命令,其中 nice 是用于提高 cron.daily 下脚运行优先级。

1    5    cron.daily        nice run-parts /etc/cron.daily

anacron 执行流程还没弄懂。

  1. 由 /etc/anacrontab 分析到 cron.daily 天数为 1 天。
  2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 时间戳。
  3. 由 2 步骤分析出的时间戳和 cron 任务进行比较,查看哪些 cron 任务超过 1 天时间没有执行。
  4. 根据 /etc/anacrontab 设置延迟执行。
  5. 延时时间到执行。

最近更新:

发布时间:

摆哈儿龙门阵