Crontab用法说明

 

from:http://nosleepman.pdx.cn/blog/diary,917912.html

 

cron来源于希腊单词chronos(意为“时间”),是linux系统下一个自动执行指定任务的程序。例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron来自动执行。服务的启动和停止cron服务是linux的内置服务,但它不会开机自动启动。可以用以下命令启动和停止服务:

/sbin/service crond start
/sbin/service crond stop
/sbin/service crond restart
/sbin/service crond reload
以上1-4行分别为启动、停止、重启服务和重新加载配置。

要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start 即可。

查看、编辑和删除cron把命令行保存在crontab(cron table)文件里,这个文件通常在 /etc 目录下。每个系统用户都可以有自己的crontab(在 /var/spool/cron/ 下)。

要查看当前用户的crontab,输入 crontab -l;
要编辑crontab,输入 crontab -e;
要删除crontab,输入 crontab -r。

如当前是root身份,要查看/编辑/删除/某用户的crontab,只需在相应的命令后加上 -u USERNAME(如 crontab -e -u USERNAME)即可。

crontab文件的默认编辑器是vi,可以输入 export VISUAL='editor' 更改默认编辑器。

cron服务每分钟不仅要读一次 /var/spool/cron 目录内的所有文件,还需要读一次 /etc/crontab 文件。配置这个文件也能让cron执行任务。使用crontab命令是对用户级任务的配置,而编辑 /etc/crontab 文件是对系统级任务的配置。

语法说明

以下是两个cron语句的例子(在 /etc/crontab 文件里)。前者用来晚间备份 /etc 目录,后者运行Analog程序处理服务器的统计信息。
12 3 * * * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
52 5 * * * root /usr/local/src/analog-5.32-lh/analog >> /dev/null 2>&1

以下是cron语句中的字段与字段说明:


字段说明

1分钟(0-59)
2小时(2-24)
3日期(1-31)
4月份(1-12;或英文缩写Jan、Feb等)
5周几(0-6,0为周日;或单词缩写Sun、Mon等)
6用户名(执行命令时以此用户的身份)
7要执行的命令(路径)

现在来看第一行:12 3 * * * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
这条语句将在每天的凌晨3点12分(03:12)运行

tar czf /usr/local/backups/daily/etc.tar.gz /etc 命令。>> /dev/null 2>&1
表示把所有标准输出发送到 /dev/null(linux的回收站),把标准错误输出(2)发送到和标准输出(1)同样的地方(即 /dev/null)。运行这行命令将不会产生任何输出。
这条语句可以变得稍微复杂一点:
30 15 13 6 1 * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
它将在6月13日周一的15:30运行 tar czf /usr/local/backups/daily/etc.tar.gz /etc 命令。

以下语句可以达到同样的效果:30 15 13 Jun Mon * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1

如果你想以用户joey的身份每小时的第15分钟运行某个程序,可以使用:
15 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1
其中的星号(*)是通配符,表示cron将忽略这个字段。
如果你想每两小时就运行某个程序,可以在小时字段里使用 */2。
它将会在2点,4点,6点……22点,24点运行。
具体语句如下:0 */2 * * * joey /usr/bin/somecommand >> /dev/null 2>&1cron

语句中还可以使用逗号(,)来指定多个时间。
例如你想在每小时的15分和30分运行某个程序,可以在分钟字段使用
15,30:15,30 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1

如果你想在每月的第一周(即1号到7号)每天的指定时间运行某个程序,可以在日期字段使用 1-7:15,30 */2 1-7 * * joey /usr/bin/somecommand >> /dev/null 2>&1
这条语句将在每月的第1-7日每两小时的15分和30分(02:15,02:30……22: 15,22:30等)运行 /usr/bin/somecommand 命令。

如果你想在每天的16:18执行一个脚本集合,可以把所有要执行的脚本放到一个目录中(如 /home/username/cron),可以使用:
18 16 * * * root run-parts /home/username/cron >> /dev/null 2>&1

如果你想保存某个程序的输出结果, 可以把 >> /dev/null 2>&1 替换为 >> /home/user/somecommand.log 2>&1 。

总结

查看当前用户的cron配置,使用 crontab -l
编辑当前用户的cron配置,使用 crontab -e
删除当前用户的cron配置,使用 crontab -r
以root身份查看/编辑/删除某用户的cron配置,在命令后加上 -u USERNAME 配置系统级的任务,编辑 /etc/crontab 文件

### Crontab 的使用方法 CrontabLinux 系统中用于定时执行任务的工具。用户可以通过编辑 crontab 文件来定义定时任务。使用 `crontab -e` 命令可以打开当前用户的 crontab 编辑界面。在编辑界面中,用户需要按照特定的格式编写任务计划。基本的 crontab 格式如下: ``` * * * * * command_to_be_executed - - - - - | | | | | | | | | +---- 星期几 (0 - 6) (星期天=0) | | | +------ 月份 (1 - 12) | | +-------- 日期 (1 - 31) | +---------- 小时 (0 - 23) +------------ 分钟 (0 - 59) ``` 例如,如果需要每天早上 6 点执行一个脚本 `/home/user/script.sh`,可以添加如下行: ``` 0 6 * * * /home/user/script.sh ``` 保存并退出后,系统会自动加载新的配置。除了添加任务之外,还可以通过 `crontab -l` 查看当前用户的 crontab 列表,使用 `crontab -r` 删除当前用户的 crontab 文件[^1]。 ### 配置步骤 1. **安装 Crontab** 在某些 Linux 发行版中,crontab 可能未默认安装。可以通过包管理器安装,例如在 Debian/Ubuntu 上使用 `sudo apt-get install cron`,在 CentOS/RHEL 上使用 `sudo yum install vixie-cron`[^1]。 2. **启动和启用 Crond 服务** 安装完成后,需要启动 crond 服务。使用 `sudo systemctl start crond` 启动服务,并使用 `sudo systemctl enable crond` 设置开机自启。若系统提示 `Redirecting to /bin/systemctl start crond.service`,这是由于系统版本差异导致的正常现象[^5]。 3. **编辑 Crontab 任务** 使用 `crontab -e` 进入编辑模式,按照上述格式添加任务。例如,创建一个每小时运行一次的备份任务: ``` 0 * * * * /home/user/backup.sh ``` 4. **环境变量设置** Crontab 默认的环境变量可能与用户的 shell 不同,因此建议在 crontab 文件中显式设置所需的环境变量,如 `PATH` 和 `SHELL`,以确保任务能够正确执行。例如: ``` SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root@localhost # 定时任务 0 2 * * * /home/user/daily_cleanup.sh ``` 5. **测试 Crontab 任务** 可以手动运行一次任务脚本来验证其是否正常工作。此外,也可以临时修改 crontab 中的时间设置,使其在几分钟后执行,以便快速测试[^2]。 ### 常见问题及解决方法 1. **任务未执行** - **检查服务状态**:确认 crond 服务正在运行,使用 `systemctl status crond` 检查服务状态。 - **检查日志文件**:查看 `/var/log/cron` 或 `/var/log/syslog`(取决于系统)中的日志信息,确认任务是否被调度以及是否有错误输出。 - **权限问题**:确保脚本具有可执行权限,使用 `chmod +x script.sh` 赋予执行权限。 - **路径问题**:在 crontab 中使用绝对路径,避免因当前工作目录不同而导致脚本无法找到依赖文件。 2. **邮件通知问题** 默认情况下,crontab 会将任务的标准输出和标准错误发送给用户。可以通过 `MAILTO` 变量指定接收邮件的地址。如果不希望收到邮件,可以在任务行末尾添加 `> /dev/null 2>&1` 来丢弃输出。 3. **环境变量差异** Crontab 的环境变量通常比用户 shell 的环境变量要少。可以在 crontab 文件中显式定义所需的环境变量,或者在脚本中使用绝对路径来调用命令和文件。 4. **特殊字符问题** 如果在命令中使用了 `%` 符号(如在 `date` 命令中),需要进行转义处理,即在 `%` 前加反斜杠 `\`,否则会被 crontab 解释为换行符。 5. **Django-Crontab 配置问题** 如果使用 Django-Crontab 模块来管理定时任务,需要确保 `django_crontab` 应用已添加到 `INSTALLED_APPS` 中,并且正确配置了 `CRONJOBS` 参数。例如: ```python CRONJOBS = [ ('*/5 * * * *', 'myapp.cron.my_scheduled_job'), ] ``` 然后使用 `python manage.py crontab add` 添加任务,使用 `python manage.py crontab remove` 移除任务。若遇到问题,可以检查 `test_crontab.py` 中的测试用例,确保模块功能正常[^4]。 ### 实用技巧与最佳实践 - **利用注释提高可读性**:在 crontab 文件中添加注释,说明每个任务的作用,有助于后续维护。例如: ``` # 每天凌晨 3 点清理临时文件 0 3 * * * /home/user/cleanup_temp_files.sh ``` - **保持任务简单**:尽量让每个 cron job 只做一件事,这样更容易调试和维护。复杂任务可以拆分为多个独立的脚本。 - **定期检查日志**:定期查看 cron 日志,确保任务按预期运行。可以使用 `grep CRON /var/log/syslog`(Debian/Ubuntu)或 `journalctl`(systemd 系统)来查看日志。 - **使用适当的时间间隔**:根据任务的实际需求选择合适的时间间隔。过于频繁的任务可能会增加系统负担,而过于稀疏的任务可能无法满足业务需求。 - **安全考虑**:限制用户对 crontab 的访问,防止未经授权的用户修改定时任务。可以通过 `/etc/cron.allow` 和 `/etc/cron.deny` 文件来控制用户权限。 - **备份 crontab 文件**:定期备份 crontab 文件,防止因误操作或系统故障导致任务丢失。可以使用 `crontab -l > crontab_backup.txt` 进行备份,并在需要时使用 `crontab crontab_backup.txt` 恢复[^1]。 --- ```bash # 示例:每小时执行一次备份脚本 0 * * * * /home/user/backup.sh ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值