我有一个bash程序,它从文件中选取数据并将这些数据(如果满足阈值)传递给另一个文件。它是名为smaoutput- analysis .sh的bash脚本中的一个php脚本当从shell执行时,它的功能是完美的。当以root身份作为cron作业执行时,执行正确,但没有输出。
下面是grep -i cron /var/log/syslog
信息(如前所述)在从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吗?