cron
在 Linux 中,cron
是一个用来安排和运行重复性任务的后台服务(或者说是一个守护进程,daemon)。
这些任务通常被称为 cron jobs
。
它的名字来源于希腊语 chronos,意为“时间”,这很恰当地描述了它的核心功能。
为什么要用 cron?
设想你每天需要备份一次数据库,或者每周要清理一次日志文件。如果没有 cron,你可能需要手动在特定时间运行这些命令,或者自己写一个脚本然后用循环来模拟这个过程。这既耗时又容易出错。
cron 的出现完美解决了这个问题。你只需要设置好任务的时间和要执行的命令,cron 就会在指定的时间自动帮你完成,解放了你的双手。
如何使用 cron?
使用 cron 最常见的方法是编辑 crontab
文件。crontab 的意思是 “cron table”(cron 表格),这个文件记录了所有你需要 cron 运行的任务。
每个用户都有自己的 crontab 文件,你可以通过以下命令来编辑它:
crontab -e
首次运行这个命令,系统可能会让你选择一个文本编辑器(比如 vim 或 nano)。选择好后,你就会看到一个新文件,其中可能有一些注释。
像下面这样:
user@user-vm:~/Desktop$ crontab -e
no crontab for xxx - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
cron 任务的语法
一个 cron 任务的语法由六个部分组成,前面五个是时间字段,最后一个是要执行的命令。
* * * * * 要执行的命令
| | | | |
| | | | |--- 星期几 (0 - 7, 0 和 7 都表示周日)
| | | |----- 月份 (1 - 12)
| | |------- 日期 (1 - 31)
| |--------- 小时 (0 - 23)
|----------- 分钟 (0 - 59)
常用的特殊字符
字符 | 含义 | 示例 |
---|---|---|
* | 匹配所有值 | * 在分钟字段表示每分钟都执行 |
, | 列举值 | 1,15,30 在分钟字段表示第1、15和30分钟执行 |
- | 指定一个范围 | 9-17 在小时字段表示早上9点到下午5点 |
/ | 指定步长 | */5 在分钟字段表示每隔5分钟 |
例子
- 表示每天凌晨 2点30分 运行
/home/user/backup.sh
这个脚本。
30 2 * * * /home/user/backup.sh
- 表示每周一的 中午12点 运行
/home/user/weekly-report.py
。
0 12 * * 1 /home/user/weekly-report.py
*/10
表示 每隔10分钟。所以这个任务每隔10分钟就会运行一次/usr/bin/some-command
*/10 * * * * /usr/bin/some-command
常用命令
- 查看当前的 crontab 文件
crontab -l
- 删除当前的 crontab 文件
crontab -r
注意要点
- 路径问题:在 cron 任务中,命令的执行路径可能和你直接在终端中不一样。建议使用绝对路径来指定命令或脚本,以避免找不到命令的错误。
- 环境变量: cron 运行时的环境变量可能非常有限。如果你的脚本依赖某些环境变量(比如
PATH
),最好在脚本开头明确设置它们。 - 输出: 默认情况下,cron 任务的任何输出(标准输出和标准错误)都会以邮件的形式发送给 crontab 的所有者。如果你不希望收到这些邮件,可以在命令末尾重定向输出到
/dev/null
* * * * * /path/to/my/script.sh > /dev/null 2>&1
# 这会将标准输出 (> /dev/null) 和标准错误 (2>&1) 都丢弃掉。