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

我错过了什么

+0

Cron脚本在非常有限的环境下运行,这意味着'PATH'和其他环境变量可能不是您所期望的。工作目录可能也不是你所期望的。 –

+0

将'sma_saved_data.txt'替换为您要保留文件的绝对路径。 –

您应检查以下问题:

  • 是否所有的环境变量一样吗?所以请致电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?