【问题标题】:Crontab wont run scriptscrontab 不会运行脚本
【发布时间】:2019-10-28 21:29:02
【问题描述】:

我的树莓派上有一个灯光秀。我还运行 crontab 来自动化它。当我在终端中运行脚本时,它运行正常并且工作完美。当 cron 运行时,它将无法正常工作。我将它设置为在演出前 15 秒关灯,开始演出,15 秒后重新打开。现在,当作业运行时,它只播放节目,继电器永远不会触发以保持灯亮或熄灭。我有 3 个脚本。一是表演,二是开灯和关灯。我在这里真的很困惑。

演出

/home/pi/lightshowpi/./lightsoff.sh
sleep 15
$SYNCHRONIZED_LIGHTS_HOME/bin/start_playlist_once $SYNCHRONIZED_LIGHTS_HOME/mus$
sleep 15
/home/pi/lightshowpi/./lightson.sh

开灯

#!/bin/bash
export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi
python py/hardware_controller.py --config=overmech.cfg --state=on

关灯

#!/bin/bash    
export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi   
python py/hardware_controller.py --config=overmech.cfg --state=off

所有这些都是带有chmod +x.sh 文件。谢谢

【问题讨论】:

  • 对不起,你能澄清一下发生了什么吗?如果您手动运行第一个脚本,一切正常,但如果您通过 crontab 运行它,那么 lightsoff.shlightson.sh 脚​​本不会运行?对吗?
  • cron 作业正在运行python py/hardware_controller.py -- 您确定该作业在py/... 可用的正确目录中执行吗?可能最好使用绝对文件名或在脚本开头添加cd <target-directory> 命令
  • 你错过了最重要的部分,你的 crontab 配置
  • Crontab 需要绝对路径才能执行
  • 这就是正在发生的事情。如果我手动触发开和关,它就可以工作。它所在的目录是/home/pi/lightshowpi

标签: python bash cron


【解决方案1】:

我不知道 PATH cronjobs 运行什么,但可能是它没有找到 python 可执行文件。尝试输入完整路径:

#!/bin/bash
export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi
/usr/bin/python py/hardware_controller.py --config=overmech.cfg --state=on

当然,假设 python 在 /usr/bin 中。

我也会输入py/hardware_controller.py 的绝对路径,但我不知道你把它放在哪里:)

【讨论】:

  • 我在开头添加了 /home/pi/lightshowpi。那就是这些命令所在的地方
  • 我继续并更改了 cronjob 以查看上面帖子中的代码会发生什么。我会让它在 10 分钟内运行,看看灯是否亮起。如果没有,我将尝试上一篇文章中的 python 代码。感谢所有的帮助。
  • 我把这段代码放到灯的开和关脚本中。 #!/bin/bash export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi /usr/bin/python /home/pi/lightshowpi/py/hardware_controller.py --config=overmech.cfg --state=on 工作到现在转关灯
  • 脚本无法重新打开灯。我设置 cron 来创建一个日志文件,但它没有创建它。我做了一个 whereis 找到它,它没有结果。
【解决方案2】:

无论是罪魁祸首,你都应该解决一些问题,通过改变这些你的 crontab 应该可以工作。

首先,与提到的其他所有人一样,确保您的 shell 脚本有这个或它在您的系统中是等效的。你也可以在你的 crontab 中使用类似的东西来重定向 sdout 和 stderrr:

*/15 * * * * /bin/bash /home/pi/lightshowpi/lightson.sh  2&>1 >> lights_on_log.txt

通过使用 2&>1,您将为运行 cron 作业的用户将 stdout 和 stderr 附加到主目录中的该文件,这样您就可以查看输出和错误并找出问题所在。

问题的最可能原因是您没有使用 python 二进制文件的完整路径,即 /usr/bin/python 而不仅仅是

python

您可能应该考虑的另一件事是,您的两个脚本的命令行参数都使用相对路径,并且取决于运行 cron 作业的用户,因为这可能会造成问题。要么切换到 py 目录和 overmech.cfg 文件所在的任何目录,要么确保也使用完全限定的路径。

我要指出的最后一点(我把它放在最后,因为它并没有多大意义)是你的一个例子显示了

/home/pi/lightshowpi/./lightsoff.sh

. 是多余的,不需要。点斜杠用于缩写当前目录中文件的完全限定路径,因为 .展开到当前工作目录和 / 帮助构建路径的最后一位。在上面的例子中,没有 .并且只使用这样的完整路径:

    /home/pi/lightshowpi/lightsoff.sh

【讨论】:

  • 这让我感到困惑。我用 on 脚本手动打开灯,它可以工作。当 cron 作业开始运行时,灯会关闭。该节目将运行。灯不会重新亮起。 on 和 off 脚本在同一个位置目录,同一个脚本,但是 on/off 词不同。我检查了 overmech.cfg 以确保没有帖子显示并且没有。这就是我的困惑所在。
  • 您是否尝试过按照建议重定向标准输出和标准错误?这肯定有助于解决问题
  • 抱歉,周末很忙。我继续将其添加到我的 lightshow.sh 命令中,因为它调用了该脚本中的 lightson.sh。我会让它循环,看看会发生什么。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2015-10-05
  • 2017-12-16
相关资源
最近更新 更多