【问题标题】:bash script running from command line but not from cron从命令行运行但不是从 cron 运行的 bash 脚本
【发布时间】:2016-08-15 03:43:26
【问题描述】:

我有一个 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/SBFspot.sh > /home/pi/test/smaoutput.txt 2>&1) 8 月 14 日 16:06:01 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 和 bash 的 +rwx

我错过了什么

【问题讨论】:

  • Cron 脚本在非常有限的环境中运行,这意味着 PATH 和其他环境变量可能不是您所期望的。工作目录可能也不是您所期望的。
  • sma_saved_data.txt 替换为您要保存文件的绝对路径。

标签: php linux bash shell cron


【解决方案1】:

您应该检查以下问题:

  • 所有的环境变量都一样吗?所以从 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 输出

【讨论】:

    【解决方案2】:

    真的很有趣。 这是我的第一篇文章,我收到了相当迅速的回复。 谢谢!

    解决方案很简单:提供要保存文件的完整路径。 备注:为了确保一切都会执行,我总是将 cronjobs 放在根 crontab 中,而不是放在用户 crontab 中。 也许那是“聪明的思考”,但不是那么聪明的表演。 我希望能对这个根 cronjob 想法发表一些评论。

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

    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和密码=/root

    来自 bash 的 echo "&USER" 给出 pi,而来自 cron 的回显给出一个空白文件

    bash 的密码是 /home/pi/test 和 cron 的 /root

    这些结果是可以理解的。

    我可以从中学到我应该以用户 pi 而不是 root 用户身份创建 cronjobs 吗?

    【讨论】:

      最近更新 更多