(转)[红旗] 手动可以执行,加入crontab 就不行了

用户遇到通过CronTab调度执行PHP脚本和MySQL备份Shell脚本时无法正常工作的问题,尽管手动执行这些脚本时能够成功运行。经过讨论,发现是由于未正确设置环境变量导致。

 


[红旗] 手动可以执行,加入crontab 就不行了

 


 

30 2 * * * root /usr/sbin/bakmysql
01 1 1 * * root /usr/local/php/bin/php -q /usr/local/apache2/htdocs/index.php


这个是crontab -l 的结果

上面的一个php脚本和一个备份mysql的shell脚本

如果手动执行以上两个文件,都是可以运行的, 有结果输入

但是加入crontab 就没结果了,php文件没有结果,mysql也没有备份

但是crontab的日志里却是有执行的
这个是怎么回事呀


下面是cron日志
1号的

Apr 1 01:01:01 NBSS crond[14047]: (root) CMD (root /usr/local/php/bin/php -q /usr/local/apache2/htdocs/index.php)
Apr 1 02:30:01 NBSS crond[14122]: (root) CMD (root /usr/sbin/bakmysql)

2号的
Apr 2 02:30:01 NBSS crond[3819]: (root) CMD (root /usr/sbin/bakmysql)

求指点



 

脚本有执行权限吗?



 

还有用绝对路径 不要用相对路径



 

脚本有执行权限,

我的crontab用的都是绝对路径



 

可能是没有初始化环境变量哦,在脚本中增加

. $HOME/.bash_profile 试试



 

可以了,

我不使用crontab -e来编辑

直接在 /etc/crontab 里编辑可以了



 

回复 6# 古道风_cu 


    root 邮件能有错误提示
__________________________________
问:你是要解决问题的过程,还是要最后的答案?



 

最好在脚本里包含path等相关的环境变量。否则很容出现楼主说的问题



 

回复 1# 古道风_cu 


      还有  crontab -e里编辑   中间别加  root  字段   

      和 etc/crontab 里有点区别
__________________________________
问:你是要解决问题的过程,还是要最后的答案?



 

php 放这里不太合适,换 curl 看看。
__________________________________
大梦谁先觉?平生我自知,草堂春睡足,窗外日迟迟。
.

 

在 Linux 系统中,`crontab` 执行脚本失败而手动执行成功是较为常见的问题,通常由环境变量、路径、权限或日志输出等差异引起。以下是一些关键排查点和解决方案: ### 3.1 环境变量问题 `crontab` 的执行环境不同于交互式 shell,它不会加载 `.bash_profile`、`.bashrc` 或 `/etc/profile` 中定义的环境变量。这可能导致脚本中使用的命令或路径无法识别。解决方法是在脚本中显式设置必要的环境变量,例如: ```bash #!/bin/bash export PATH=/usr/local/bin:/usr/bin:/bin # 脚本内容 ``` 这样可以确保脚本在 `crontab` 中运行时拥有与手动执行时一致的环境变量[^2]。 ### 3.2 脚本路径问题 由于 `crontab` 不会自动切换到用户的当前工作目录,因此脚本中使用的相对路径可能导致文件找不到。建议在脚本中使用绝对路径,或者在脚本开头显式切换目录: ```bash #!/bin/bash cd /home/user/scripts # 脚本内容 ``` 这样可以避免因路径问题导致的脚本执行失败[^1]。 ### 3.3 权限问题 确保脚本具有可执行权限。可以通过以下命令为脚本添加执行权限: ```bash chmod +x /path/to/script.sh ``` 此外,检查脚本及其依赖文件的所有权是否正确,确保 `crontab` 用户有权限执行这些文件[^1]。 ### 3.4 日志输出和错误信息 为了更好地排查问题,建议将脚本的标准输出和标准错误重定向到日志文件中。例如: ```bash * * * * * /bin/bash /home/user/script.sh >> /home/user/cron.log 2>&1 ``` 这样可以查看脚本执行时的输出和错误信息,帮助定位问题[^5]。 ### 3.5 命令路径问题 在脚本中使用的命令如果没有指定完整路径,可能在 `crontab` 中找不到。例如,`jcmd`、`lsof` 等命令在 `crontab` 环境下可能无法直接执行。建议使用命令的完整路径,例如: ```bash #!/bin/bash /usr/bin/jcmd ${jarpid} Thread.print -l >> /home/user/jcmd.log /usr/sbin/lsof -p ${jarpid} >> /home/user/lsof.log ``` 这样可以避免因命令路径问题导致的执行失败[^4]。 ### 3.6 测试与验证 在将脚本添加到 `crontab` 之前,先在命令行中手动执行脚本,确保其能够正常运行。如果手动执行成功但 `crontab` 执行失败,通常是因为环境变量或路径问题。可以尝试在脚本中输出当前环境变量,以便对比差异: ```bash #!/bin/bash env > /home/user/env.log ``` 这样可以查看 `crontab` 执行时的环境变量,并与手动执行时的环境进行对比[^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值