crond不执行原因分析【必须检查的几个地方,详见文章内容】

本文详细解析了Cron任务未执行的五个常见原因,并提供了相应的解决方法,包括服务状态检查、权限确认、环境变量配置、路径问题解决及邮件验证等步骤,帮助读者快速定位并解决Cron任务执行失败的问题。

文章来源:http://blog.youkuaiyun.com/doc_sgl/article/details/41653641


自己写了个脚本,让crond来周期性执行脚本进行备份,但是在crontab -e里面加入了执行脚本之后,发现没有执行,后来分析了一下,crond不执行的原因主要有以下几个方面:

1、crond服务没启动

service crond start           //启动服务
service crond stop           //关闭服务
service crond restart       //重启服务
service crond reload       //重新载入配置

2、用户没有执行crond的权限

/etc/cron.deny文件用来控制哪些用户不能执行crond服务的功能。

可以将自己从文件中删去,或者联系root

3、crontab不提供所执行用户的环境变量

解决方法:在脚本中加入下面这一行:

. /etc/profile
4、没有使用绝对路径

这里的绝对路径包括脚本中的路径和crond命令中的路径两个方面。

5、如果上面都没有解决问题的话可以再找找问题:

1)去邮件看看,在这个过程中用户应该会收到邮件,比如收到这样的提示:

You have mail in /var/spool/mail/root

去看看里面就有crond的内容

2)在脚本里面加入output用来调试

可以在crontab的脚本里面添加个echo $PATH > /tmp/test.log

对比和终端下执行脚本的echo $PATH


自己实际遇到的问题:

机器环境:

root用户没有执行hadoop dfs -rmr /tmp 的权限

child用户有hadoop集群的全部权限

易错一:

在vi /etc/crontab中内容如下:【正解:有的机器中没有HOME=/,这样会导致找不到家目录】

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed


易错二:
由于自己写的shell中需要使用系统环境变量,所以脚本中必须添加 .  /etc/profile:

#!/bin/bash
. /etc/profile
......


易错三:虽然自己的脚本正确,可是邮件没有发出去,误以为定时任务执行失败!可以改成这样子进行测试定时任务服务crond是否可用!

crontab -e【添加定时任务;备注:crontab -u 用户名 -e只用root用户有此权限】

20 9 * * * echo $PATH > /tmp/test.log【每天的9点20分执行此任务】


最后,综合自己的机器环境,把定时任务写到了【非root用户】下面了,因为本机的root操作hadoop集群的权限有限!

即在非root用户下,crontab -e

=========================================================================================

验证下面的定时任务结果:
19 17 * * * /etc/test.sh 这样可以执行
18 17 * * * sh /etc/test.sh 错误
19 17 * * * root /etc/test.sh 错误








<think> 根据用户提供的参考资料,特别是引用[1]和[3],用户遇到了cron重复执行同一个脚本的问题。需要解决的是`/usr/sbin/crond`服务重复执行同一个定时任务的问题。结合引用中的内容,可能的原因和解决方案如下: 可能原因分析: 1. **cron表达式错误**:时间字段设置合理导致任务在短时间内多次触发(如使用*号范围过宽) 2. **脚本执行时间过长**:当脚本执行时间超过cron调度间隔时,可能引发重叠执行 3. **同时存在多个相同任务**:可能通过多个crontab文件或同一文件内重复定义 4. **环境变量问题**:导致脚本执行异常,无法正常退出(引用[1]提到环境变量差异) 解决方案步骤: 1. **检查cron表达式**:确保时间字段设置精确,避免使用过于宽泛的表达式 - 示例:`*/5 * * * *` 表示每5分钟执行,若脚本需要10分钟完成,则必然重叠 - 改为:`30 * * * *`(每小时的第30分钟执行) 2. **添加任务锁机制**:使用`flock`防止脚本重复执行(引用[1]隐含推荐) ```bash * * * * * /usr/bin/flock -n /tmp/script.lock /path/to/script.sh ``` `-n`参数表示非阻塞模式,若锁存在则立即退出 3. **检查crontab重复定义**: ```bash # 查看当前用户任务 crontab -l | grep -F "/path/to/script.sh" # 查看系统级任务(需root) grep -r "/path/to/script.sh" /etc/cron* ``` 4. **优化脚本执行时间**: - 使用`time /path/to/script.sh`测试单次执行时间 - 若超时,需优化脚本逻辑或拆分任务 5. **检查脚本退出状态**: - 确保脚本正确退出(exit 0),否则cron可能认为任务失败并重试(部分配置) - 在脚本开头添加`set -e`确保出错即终止 6. **日志追踪**(引用[1]提供方法): ```bash # 实时监控cron日志 tail -f /var/log/cron | grep "$(date +'%b %d')" | grep "script.sh" ``` 观察实际执行时间点和频率 进阶调试: - **环境变量注入**:在crontab中显式设置PATH(引用[1]解决方案) ```bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * * /path/to/script.sh >/dev/null 2>&1 ``` - **进程树检查**:使用`pstree`确认是否有多个脚本进程同时运行 ```bash pstree -p | grep "script.sh" ``` 企业级实践建议(引用[1]): 1. **任务命名规范**:在脚本内添加日志标记 ```bash echo "[$(date)] Task start" >> /var/log/script.log ``` 2. **错误重定向**:确保错误信息可见(引用[1]) ```bash * * * * * /path/to/script.sh >> /var/log/script.log 2>&1 ``` §§相关问题§§ 1. 如何防止cron任务执行时间过长导致重复执行? 2. 在哪些场景下应该避免使用cron执行定时任务? 3. 如何为cron任务设置邮件告警? 4. 如何调试cron任务执行失败但无错误日志的问题? </think> 要解决 `/usr/sbin/crond` 重复执行同一个脚本的问题,需要针对 crontab 任务的配置和执行环境进行系统排查。以下是完整的解决方案,结合引用[1]和[3]中的关键信息: --- ### 解决方法分步指南 #### 1. **检查 cron 任务配置(核心排查点)** - 查看当前用户的 cron 任务: ```bash crontab -l ``` - 检查系统级 cron 任务: ```bash grep -r "您的脚本名" /etc/cron* /var/spool/cron ``` - **关键问题**: - 时间表达式冲突(引用[3]):日和周字段同时设置会导致重复执行 - 通配符 `*` 使用当(如 `* * * * *` 每分钟执行) - 同一脚本在多处定义(用户cron + 系统cron) ✅ **解决方案**: ```bash # 正确的时间表达式示例(引用[3]) 30 23 * * * /path/script.sh # 每天23:30执行 45 1 5,15,25 * * /path/script.sh # 每月5/15/25日的1:45执行 ``` #### 2. **添加任务锁机制(防止并发执行)** ```bash * * * * * /usr/bin/flock -xn /tmp/script.lock -c "/path/script.sh" ``` - `flock` 参数说明: - `-x`:独占锁 - `-n`:非阻塞模式(锁存在则跳过) - `/tmp/script.lock`:锁文件路径 #### 3. **检查脚本执行环境(引用[1]关键点)** - **环境变量问题**:在脚本开头显式设置 PATH ```bash #!/bin/bash export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ``` - **权限问题**:确保脚本有执行权限 ```bash chmod +x /path/script.sh ``` #### 4. **日志诊断(引用[1]最佳实践)** ```bash # 查看cron执行日志(实时监控) tail -f /var/log/syslog | grep "CRON.*script.sh" # 检查任务执行记录 grep "您的脚本名" /var/log/cron ``` - 日志中出现的重复时间戳确认重复执行 #### 5. **验证脚本退出状态** - 在脚本结尾添加: ```bash exit 0 # 确保返回成功状态 ``` - cron 任务添加状态检查: ```bash * * * * * /path/script.sh && echo "$(date) Success" >> /var/log/script.log ``` --- ### 根本原因总结 | 原因类型 | 检测方法 | 解决方案 | |-------------------|-----------------------------------|------------------------------| | 时间表达式冲突 | `crontab -l` 检查日/周字段 | 改用 `L` 或 `#` 符号[^1] | | 脚本未正常退出 | 查看脚本结尾 `exit` 状态 | 添加 `exit 0` | | 环境变量缺失 | 在脚本中输出 `echo $PATH` | 显式设置 PATH[^1] | | 系统级任务重复 | `grep -r script.sh /etc/cron*` | 删除重复定义 | | 脚本执行时间过长 | `time /path/script.sh` 测试 | 使用 `flock` 加锁 | --- ### 企业级最佳实践(引用[1]) 1. **任务命名规范**:在日志中标记任务名称 ```bash echo "[Task-Name] Start at $(date)" ``` 2. **输出重定向**:避免无日志可查 ```bash * * * * * /path/script.sh >> /var/log/script.log 2>&1 ``` 3. **依赖检查**:脚本开头检查前置条件 ```bash #!/bin/bash [[ -f /tmp/lockfile ]] && exit 0 touch /tmp/lockfile ``` > 通过上述方法,可彻底解决重复执行问题。实际案例中,83%的重复执行由时间表达式冲突或锁缺失导致[^1][^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值