bash脚本从命令行运行但不是从cron运行
我有一个bash程序,它从文件中选取数据并将这些数据(如果满足阈值)传递给另一个文件。 这是一个名为smaoutput-analyse.sh的bash脚本中的php脚本。当从shell执行它时,它的功能非常完美。 作为cron作业执行时,作为root执行的是正确的,但没有输出。bash脚本从命令行运行但不是从cron运行
下面是grep -i cron /var/log/syslog
Aug 14 16:06:01 raspberrypi CRON[6705]: (root) CMD (/home/pi/scripts/SBFspot.sh > /home/pi/test/smaoutput.txt 2>&1) Aug 14 16:06:01 raspberrypi CRON[6706]: (root) CMD (/home/pi/test/smaoutput-analyse.sh > /dev/null 2>&1)
输出的信息是(如前面提到的)正确地添加运行FOM当壳
#!/usr/bin/php
<?php
echo " Programm to read smaoutput.txt",PHP_EOL;
// etc etc
`if(!file_put_contents("sma_saved_data.txt",$sma_saved_data_string,FILE_APPEND)){
// failure
echo "error opening the file sma_saved_data.txt for writing",PHP_EOL;
}
// etc etc
?>
下面是crontab的线:
# Every minute result of SMA
*/1 8-22 * * * /home/pi/scripts/SBFspot.sh > /home/pi/test/smaoutput.txt 2>&1
# afterwards read and save in file
*/1 10-20 * * * /home/pi/test/smaoutput-analyse.sh > /dev/null 2>&1
我想我已经为文件和+ rwx设置了文件权限正确+ rw在bash
我错过了什么
您应检查以下问题:
- 是否所有的环境变量一样吗?所以请致电printenv bash并创建一个cron-job */1 8-22 * * * printenv> /tmp/printenv.txt - >将文件/tmp/printenv.txt的输出与bash中的printenv进行比较
- 您是否使用相同的用户和相同的权限执行?执行echo“$ USER”并创建一个cron-job */1 8-22 * * * echo“$ USER”> /tmp/user.txt - >比较file/tmp/user的输出。 txt带回声“$ USER”来自bash
- 检查您执行脚本的路径。从bash调用pwd并创建一个cron-job */1 8-22 * * * pwd> /tmp/pwd.txt - >比较文件/tmp/pwd.txt的输出与pwd的输出来自bash
真是有趣。 这是我的第一篇文章,我收到了相当迅速的回应。 谢谢!
解决方案很简单:提供要保存文件的完整路径。 备注:为了确保一切都将被执行,我总是将cronjobs放在根crontab中,而不是放在用户crontab中。 也许这是“聪明的思维”,但不是那么聪明的行为。 我希望得到这个root cronjob想法的一些评论。
关于执行printenv,echo“& USER”和pwd都来自bash和cron的帖子很有趣。
bash的printenv提供了很多信息,其中SHELL =/bin/bash,SSH_CLIENT,SSH_TTY。MAIL,PATH,SSH_CONNECTION以及更多从LS_COLORS开始的,来自cron的printenv只有6行HOME =/root,LOGNAME = root,PATH =/usr/bin,LANG = en_GB,UTF-8,SHELL =/bin/sh和PWD = /根
回声 “& USER” 从bash中给出PI,同时从cron给出了一个空白文件
从bash的该PWD给出的/ home/PI /测试和从cron /根
这些结果是可以理解的。
我可以从中学习到,我应该创建cronjobs作为用户pi而不是用户root?
Cron脚本在非常有限的环境下运行,这意味着'PATH'和其他环境变量可能不是您所期望的。工作目录可能也不是你所期望的。 –
将'sma_saved_data.txt'替换为您要保留文件的绝对路径。 –