在 Raspberry Pi 上从 cron 运行 sudo(或启动)python 脚本?

在 Raspberry Pi 上从 cron 运行 sudo(或启动)python 脚本?

我正在帮忙一个艺术项目(http://stargateeggbeater.com/对于那些感兴趣的人)构建在 Raspberry Pi 上。 RPi 通过 GPIO 控制可寻址 LED 灯条,使用spidev以下设备指示。要启动显示,我们运行:

sudo python lightpaint-FF.py

我们计划将该项目带到聚会和节日,因此理想情况下我们希望它在启动时自动运行。 (我们的 RPi 没有连接显示器,所以现在我们必须使用 SSH 使用另一台笔记本电脑登录并运行代码,nohup然后再次注销)。

我解决这个问题的第一次尝试是编写一个简单的 bash 脚本:

#!/bin/bash

if [ ! "$(pidof python)" ] 
 then
   sudo python /home/pi/lightpaint-FF.py
fi

并修改/etc/crontab以包括

* * * * * root /home/pi/EggbeaterCronJob

所需的行为是每分钟检查一次以查看是否有任何 Python 实例正在运行,如果没有,则启动 python 脚本。我已经验证该脚本在从终端调用时可以正常工作:

pidof python # returns nothing
sudo /home/pi/EggbeaterCronJob
pidof python # returns new process ID

但是更新 my 后crontab,没有任何 python 进程 ID 自行出现。为了确定起见,我还确保我的crontab配置中没有犯下愚蠢的错误:

* * * * * root touch test-freaking-cron

这证实了它cron确实响应了我的编辑。

答案1

删除它sudo不需要的,因为它以 root 身份运行,并且 sudo 默认情况下不会在没有 tty 的情况下运行。

visudo您可以通过运行并注释掉 requiretty来告诉 sudo 在没有 tty 的情况下运行:

#Default requiretty

注意这确实存在安全缺陷,请参阅这里

答案2

如果您需要在引导时启动程序,大多数设置中最简单的方法是将命令添加到/etc/rc.local.如果该文件存在,请添加以下行:

python /path/to/lightpaint-FF.py &

如果该文件不存在,请尝试使用内容创建它

#!/bin/sh
python /path/to/lightpaint-FF.py &
exit 0

一些嵌入式发行版不支持/etc/rc.local.如果您使用的不是,请告诉我们它是什么。


如果您需要监视程序并在程序死机时重新启动它,您可以通过init.如何执行此操作取决于您的发行版使用哪个 init。

  • 对于传统的 init,添加一行/etc/inittab。 BusyBox 可以支持 inittab,但它是一个可选功能,需要在编译时选择。

    lp:2345:respawn:/usr/in/python /path/to/lightpaint-FF.py
    
  • 对于暴发户,写一份暴发户的工作](http://upstart.ubuntu.com/getting-started.html)。

相关内容