守护进程

cron

cron 是一个用于执行任务计划的 守护进程

在 systemV 系统中,cron 是做为启动脚本启动的,通常保存在 /etc/rc.d/init.d//etc/init.d/ 目录中。

在 systemD 系统中,cron 是一个守护进程,其服务单元为 ` /lib/systemd/system/crond.service,由 systemctl start crond.service` 命令启动。

cron 自动检查的配置文件

cron 作为守护进程会每分钟自动检查特定文件和目录,以便执行其中配置的任务计划。

  • /etc/crontab:cron 主配置文件
  • /etc/cron.d/:目录中的所有 cron 配置文件,这些是按功能区分的独立配置文件,如 0hourly
  • /var/spool/cron/crontab 的配置文件。在该目录中搜索与 Linux 用户同名的配置文件,将其加载到内存。
  • /etc/anacrontabanacron 的配置文件。

主配置文件

cron 的主配置文件为 /etc/crontab

周期格式为 分 时 日 月 周 用户 命令 指每周的星期几。

# cron 配置文件语法
# .---------------- 分 (0 - 59)
# |  .------------- 时 (0 - 23)
# |  |  .---------- 日 (1 - 31)
# |  |  |  .------- 月 (1 - 12) 或 jan,feb,mar,apr ...
# |  |  |  |  .---- 星期 (0 - 6) (周日=0 or 7) 或 sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command

一次性任务计划工具

at

在指定时间 单次 执行任务,任务执行完毕,该计划即删除。

语法

at [-V] [-q queue] [-f file] [-mMlv] timespec...

at [-V] [-q queue] [-f file] [-mMkv] [-t time]

at -c job [job...]

at [-rd] job [job...]

at -b

atq 查看当前计划任务列表

atrm 5 通过指定任务号码,删除指定计划任务

-m 强制给用户发邮件

-l 相当于 atq,查看该用户的所有计划任务

-r/-d 相当于 atrm,删除指定计划任务

-b 相当于 batch,系统负载低于特定值时才执行计划任务

-v 用较明显的时间格式查看 at 计划任务列表

-c 查看指定任务号码的任务内容

时间格式

at 使用一种非常生活化的方式来表示时间和日期,它甚至懂得一些人们日常会使用的词语。

表示方法 含义
noon 12:00 PM October 18 2014
midnight 12:00 AM October 19 2014
teatime 4:00 PM October 18 2014
tomorrow 10:00 AM October 19 2014
noon tomorrow 12:00 PM October 19 2014
next week 10:00 AM October 25 2014
next monday 10:00 AM October 24 2014
fri 10:00 AM October 21 2014
NOV 10:00 AM November 18 2014
9:00 AM 9:00 AM October 19 2014
2:30 PM 2:30 PM October 18 2014
1430 2:30 PM October 18 2014
2:30 PM tomorrow 2:30 PM October 19 2014
2:30 PM next month 2:30 PM November 18 2014
2:30 PM Fri 2:30 PM October 21 2014
2:30 PM 10/21 2:30 PM October 21 2014
2:30 PM Oct 21 2:30 PM October 21 2014
2:30 PM 10/21/2014 2:30 PM October 21 2014
2:30 PM 21.10.14 2:30 PM October 21 2014
now + 30 minutes 10:30 AM October 18 2014
now + 1 hour 11:00 AM October 18 2014
now + 2 days 10:00 AM October 20 2014
4 PM + 2 days 4:00 PM October 20 2014
now + 3 weeks 10:00 AM November 8 2014
now + 4 months 10:00 AM February 18 2015
now + 5 years 10:00 AM October 18 2019

范例

五分钟后,把文件寄给 root

~]# at now + 5 minutes
at> /bin/mail -s "testing at job" root < /root/.bashrc
at> <EOT>
job 2 at Thu Jul 30 19:35:00 2015

查看第 2 个计划任务

at -c 2

于 2015/08/04 23:00 关机

~]# at 23:00 2015-08-04
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 3 at Tue Aug 4 23:00:00 2015

周期性任务计划工具

crontab

crontab 命令专门用于维护 crontab 配置文件。

用户可以使用该工具来维护自身的任务计划。

crontab 会为每个用户安装一个独立的 crontab 表文件,它们也需要借助 cron 守护进程来实现任务计划。

CentOS 7 中的 cron 支持把所有任务计划文件保存在网络共享目录中。

配置文件

每个用户的任务计划配置文件被单独保存为 /var/spool/cron/username,但 不要直接编辑,必须使用 crontab -e,以避免产生语法错误。

周期格式为 分 时 日 月 周 命令 指每周的星期几。

crontab 在运行任务计划时,会以该用户的身份运行,并且 工作目录 默认为 $HOME,而且看不到 bash 的 环境变量。因此,在做任务计划脚本时,一定要充分考虑到这些因素。

加载指定配置文件

通过加载指定的配置文件,可以解决诸多 只有在 crond 中才会遇到的问题

source /home/neo/.bash_profile
GIT 权限不足问题

在 cron 中运行 git 时,可能会遇到 Permission denied (publickey). 的问题,这是因为 SSH 客户端能看到和使用的一些参数,cron 是看不到的,比如 SSH 公钥。因此在 cron 环境中连接 SSH 时是没有公钥可用的,必须手动指定。通常借助 keychain 把公钥先放到缓存中,再导入相关的环境变量就可以解决。详见这里

语法

crontab [-u username] [-l|-e|-r]

-u 为指定用户创建或删除计划任务

-e 编辑任务

-l 查看任务

-r 删除全部计划任务

运行 crontab -e 之后会进入 vi 的界面,每个计划任务一行,以固定格式编辑。

辅助字符

字符 代表意义 范例
* 任何时刻都接受 05 12 * * * 每天 12:05 执行
, 分隔时刻 0 3,6 * * * 每天 3 点和 6 点都要执行
- 时间范围 20 8-12 * * * 8点到12点期间的每小时的20分都执行
/n 每隔 n 单位 */5 * * * * 每五分钟执行一次

各字段有效值

代表意义 分钟 小时 日期 月份 命令
数字范围 0-59 0-23 1-31 1-12 0-7 具体任务内容

在需要循环的字段上写明具体数字,不使用的字段用星号代替。

用 0 到 7 表示,0 和 7 均代表 星期日

范例

在不同用户间复制任务计划
$ crontab -u user1 -l | crontab -u user2
用 neo 的身份,每天 12:00 给自己发邮件
~]$ crontab -e
 0 12 * * * mail -s "at 12:00" neo < /home/neo/.bashrc
每年 5 月 1 日 23:59 发邮件给 kiki,邮件内容保存在 /home/neo/lover.txt。
59 23 1 5 * mail kiki < /home/neo/lover.txt
每五分钟执行一次 /home/neo/test.sh
*/5 * * * * /home/neo/test.sh
每周五 16:30 发邮件
 30 16 * * 5 mail friend@his.server.name < /home/neo/friend.txt
查看计划任务
~]$ crontab -l
0 12 * * * mail -s "at 12:00" neo < /home/neo/.bashrc
59 23 1 5 * mail kiki < /home/neo/lover.txt
清除全部计划任务
~]$ crontab -r
~]$ crontab -l
no crontab for neo

anacron

anacron 的运行频率为 每天。它不假设主机会持续运行。因此,可以用于 非持续运转的主机,执行日、周、月的周期性计划任务。

语法

anacron [-sfn] [job]..

anacron -u [job]..

-s 依次执行计划任务,前一个任务完成后,才继续执行下一个

-f 强制执行,忽略时间戳

-n 立即进行未进行的任务,忽略延迟时间

-u 仅更新时间戳,不执行计划任务

配置文件

/etc/anacrontab 为 anacron 配置文件。默认包含每天、每周、每月的计划任务。

计划任务主要字段为:

间隔天数,延迟分钟数,任务名称,命令

时间戳文件

/var/spool/anacron/ 目录中保存了 cron.dailycron.monthlycron.weekly 时间戳文件,文件内容仅是 一行日期,格式如 20171001。

每次执行完计划任务,anacron 就会更新这些时间戳。