Linux 的 crond
服务对脚本格式有以下重要要求,了解这些可以避免常见问题:
- 必须首行指定解释器:#!/bin/bash
或 #!/usr/bin/python
等
- 如果没有 shebang,默认使用 /bin/sh 执行
- crond 执行环境与用户shell环境不同,PATH通常只有 /usr/bin:/bin
- 建议:
bash
# 脚本开头明确定义PATH
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
- 脚本必须具有可执行权限:chmod +x /path/script.sh
- 建议将脚本放在受控目录(如 /usr/local/bin/)
- 默认会邮件发送所有输出(stdout/stderr) - 推荐重定向输出: ```bash # 示例:丢弃输出 * * * * * /path/script.sh >/dev/null 2>&1
# 或记录到日志 * * * * * /path/script.sh >> /var/log/script.log 2>&1 ```
- 所有文件路径都应使用绝对路径 - 示例问题: ```bash # 错误 - crond可能找不到文件 cat config.ini
# 正确 cat /full/path/to/config.ini ```
- 百分号(%)需要转义为\%
- 示例:
```bash
# 错误
* * * * * echo "Time: $(date +%Y-%m-%d)"
# 正确 * * * * * echo "Time: $(date +\%Y-\%m-\%d)" ```
- 基本格式:分钟 小时 日 月 周 命令
- 特殊符号:
- *
任意值
- ,
值列表分隔符
- -
范围
- /
步长值
- 检查 cron 日志(通常 /var/log/cron 或 /var/log/syslog)
- 测试时先设置未来1-2分钟执行
- 临时添加日志输出:
bash
* * * * * /path/script.sh && echo "$(date): Success" >> /tmp/cron_debug.log
常见问题解决方案: 1. 脚本在终端能运行但cron不执行: - 检查环境变量差异 - 检查文件路径是否为绝对路径
收到意外的cron邮件:
>/dev/null 2>&1
丢弃输出时间表达式不生效:
最佳实践:
1. 复杂脚本建议先用 bash -x /path/script.sh
测试
2. 重要的生产环境脚本建议添加超时控制:
bash
# 设置30秒超时
timeout 30 /path/script.sh
3. 建议使用 crontab -e
而非直接编辑 /var/spool/cron 文件
通过遵循这些格式要求,可以确保 crond 正确执行您的脚本任务。