Bash脚本从命令行运行,而不是从cron运行


bash script running from command line but not from cron

我有一个bash程序,它从文件中选取数据并将这些数据(如果满足阈值)传递给另一个文件。它是名为smaoutput- analysis .sh的bash脚本中的一个php脚本当从shell执行时,它的功能是完美的。当以root身份作为cron作业执行时,执行正确,但没有输出。

下面是grep -i cron /var/log/syslog

的输出<>之前8月14日16:06:01 raspberrypi CRON[6705]: (root) CMD (/home/pi/scripts/sbspot .sh>/home/pi/test/smaoutput.txt 2>&1)raspberrypi CRON[6706]: (root) CMD (/home/pi/test/smaoutput- analysis .sh>/dev/null 2>&1)之前

信息(如前所述)在从shell

运行时正确添加
#!/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

我想我已经设置了正确的文件权限+rw为文件和+rwx为bash

我错过了什么

您应该检查以下问题:

  • 所有的环境变量都相同吗?因此,从bash中调用printenv并创建一个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 ->将/tmp/USER .txt文件的输出与bash
  • echo "$USER"的输出进行比较
  • 检查执行脚本的路径。在bash中调用pwd并创建一个cron-job */1 8-22 * * pwd>/tmp/pwd.txt ->将/tmp/pwd.txt文件的输出与bash
  • 中的pwd输出进行比较

真有意思。这是我的第一个帖子,我收到了相当迅速的回应。谢谢你!

解决方案很简单:提供想要保存文件的完整路径。注意:为了确保所有文件都能执行,我总是把cronjobs放在根目录下,而不是用户目录下。也许这是"聪明的想法",但不是那么聪明的行动。如果您能对这个root cronjob的想法给出一些评论,我将不胜感激。

关于在bash和cron中执行printenv, echo "&USER"和pwd的帖子很有趣。

来自bash的printenv给出了很多信息,其中SHELL=/bin/bash, SSH_CLIENT, SSH_TTY。MAIL, PATH, SSH_CONNECTION和更多从LS_COLORS开始,从cron打印的文件只有6行HOME=/root, LOGNAME=root, PATH=/usr/bin, LANG=en_GB,UTF-8, SHELL=/bin/sh和PWD=/root

bash返回"&USER"返回pi,而从cron返回一个空白文件

bash的pwd给了/home/pi/test和cron/root

这些结果是可以理解的。

我能从中学到应该以pi用户而不是root用户创建cronjob吗?