Cron 是一个调度守护进程,按指定的时间间隔执行任务。这些任务称为 cron 作业,主要用于自动化系统维护或管理。
例如,您可以设置 cron 作业来自动执行重复任务,例如备份数据库或数据,使用最新的安全补丁更新系统,检查磁盘空间使用情况、发送电子邮件等。
cron 作业可以安排按分钟、小时、每月的某一天、每月、每周的某一天或这些的任意组合运行。
什么是 crontab 文件#
Crontab(cron 表)是一个文本文件,用于指定 cron 作业的计划。有两种类型的 crontab 文件。系统范围的 crontab 文件和个人用户 crontab 文件。
用户的 crontab 文件根据用户名命名,其位置因操作系统而异。在基于 Red Hat 的发行版(例如 CentOS)中,crontab 文件存储在/var/spool/cron
目录,而在 Debian 和 Ubuntu 上文件存储在/var/spool/cron/crontabs
目录。
虽然您可以手动编辑用户 crontab 文件,但建议使用crontab
命令。
The /etc/crontab
文件和里面的脚本/etc/cron.d
目录是系统范围的 crontab 文件,只能由系统管理员编辑。
在大多数 Linux 发行版中,您还可以将脚本放入/etc/cron.{hourly,daily,weekly,monthly}
目录,并且脚本将每隔hour/day/week/month
.
Crontab 语法和运算符#
用户 crontab 文件中的每一行包含六个字段,用空格分隔,后跟要运行的命令。
* * * * * command(s)
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
前五个字段可以包含一个或多个由逗号分隔的值或由连字符分隔的一系列值。
-
*
- 星号运算符表示任何值或始终。如果“小时”字段中有星号,则表示该任务将每小时执行一次。
-
,
- 逗号运算符允许您指定要重复的值列表。例如,如果您有1,3,5
在“小时”字段中,任务将在凌晨 1 点、凌晨 3 点和凌晨 5 点运行。
-
-
- 连字符运算符允许您指定值的范围。如果你有1-5
在星期几字段中,任务将在每个工作日运行(从星期一到星期五)。
-
/
- 斜杠运算符允许您指定将在它们之间的特定间隔内重复的值。例如,如果您有*/4
在“小时”字段中,表示该操作将每四个小时执行一次。与指定相同0,4,8,12,16,20
。您还可以使用一系列值,而不是在斜杠运算符之前使用星号,1-30/10
意思是一样的1,11,21
.
系统范围的 crontab 文件#
系统范围的 crontab 文件的语法与用户 crontab 略有不同。它包含一个附加的强制用户字段,指定哪个用户将运行 cron 作业。
* * * * * <username> command(s)
预定义宏#
有几个特殊的 Cron 调度宏用于指定公共间隔。您可以使用这些快捷方式代替五列日期规范。
-
@yearly
(or @annually
) - 每年 1 月 1 日午夜(中午 12:00)运行一次指定任务。相当于0 0 1 1 *
.
-
@monthly
- 每月第一天午夜运行一次指定任务。相当于0 0 1 * *
.
-
@weekly
- 每周周日午夜运行一次指定任务。相当于0 0 * * 0
.
-
@daily
- 每天午夜运行一次指定任务。相当于0 0 * * *
.
-
@hourly
- 每小时开始时运行一次指定的任务。相当于0 * * * *
.
-
@reboot
- 在系统启动时(引导时)运行指定的任务。
Linux crontab 命令#
The crontab
命令允许您安装,view,或打开 crontab 文件进行编辑:
-
crontab -e
- 编辑 crontab 文件,如果尚不存在则创建一个。
-
crontab -l
- 显示 crontab 文件内容。
-
crontab -r
- 删除当前的 crontab 文件。
-
crontab -i
- 删除当前的 crontab 文件,并在删除前进行提示。
-
crontab -u <username>
- 编辑其他用户的 crontab 文件。此选项需要系统管理员权限。
crontab 命令使用指定的编辑器打开 crontab 文件VISUAL
or EDITOR
环境变量。
crontab 变量#
cron 守护进程自动设置几个环境变量
.
- 默认路径设置为
PATH=/usr/bin:/bin
。如果您正在执行的命令不存在于 cron 指定的路径中,您可以使用该命令的绝对路径或更改 cron$PATH
多变的。你不能含蓄地追加:$PATH就像使用常规脚本一样。
- 默认 shell 设置为
/bin/sh
。要更改不同的外壳,请使用SHELL
多变的。
- Cron 从用户的主目录调用命令。这
HOME
可以在 crontab 中设置变量。
- 电子邮件通知将发送给 crontab 的所有者。要覆盖默认行为,您可以使用
MAILTO
环境变量,其中包含您想要接收电子邮件通知的所有电子邮件地址的列表(以逗号分隔)。什么时候MAILTO
已定义但为空 (MAILTO=""
),没有邮件被发送。
crontab 限制#
The /etc/cron.deny
and /etc/cron.allow
文件允许您控制哪些用户有权访问crontab
命令。这些文件由用户名列表组成,每行一个用户名。
默认情况下,仅/etc/cron.deny
文件已存在并且为空,表示所有用户都可以使用crontab命令。如果要拒绝特定用户访问 crontab 命令,请将用户名添加到此文件中。
If the /etc/cron.allow
文件存在,只有该文件中列出的用户才能使用crontab
命令。
如果这两个文件都不存在,则只有具有管理权限的用户才能使用crontab
命令。
Cron 作业示例#
下面是一些 cron 作业示例,展示了如何安排任务在不同时间段运行。
-
周一至周五每天15:00运行命令:
0 15 * * 1-5 command
-
运行脚本每 5 分钟并将标准输出重定向到dev null
,只有标准错误才会发送到指定的电子邮件地址:
MAILTO=email@example.com
*/5 * * * * /path/to/script.sh > /dev/null
-
每周一下午 3 点运行两个命令(使用运算符&&
命令之间):
0 15 * * Mon command1 && command2
-
每 2 分钟运行一个 PHP 脚本将输出写入文件
:
*/2 * * * * /usr/bin/php /path/to/script.php >> /var/log/script.log
-
每天、每小时、从上午 8 点到下午 4 点整点运行一个脚本:
00 08-16 * * * /path/to/script.sh
-
在每月第一个星期一上午 7 点运行脚本。
0 7 1-7 * 1 /path/to/script.sh
-
每月 1 日和 15 日晚上 9:15 运行脚本:
15 9 1,15 * * /path/to/script.sh
-
设置自定义HOME
, PATH
, SHELL
and MAILTO
变量并每分钟运行一个命令。
HOME=/opt
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/usr/bin/zsh
MAILTO=email@example.com
*/1 * * * * command
结论#
Cron 是一个守护进程,允许您在特定日期和时间安排任务。
如果您有任何疑问,请随时发表评论。