【问题标题】:Python script not runnig on boot - raspberryPython脚本未在启动时运行 - 覆盆子
【发布时间】:2015-09-15 10:59:06
【问题描述】:

我在我的树莓派上做了一个 python 脚本 - /home/pi/bin/script.py:

#!/usr/bin/python

 from urllib2 import urlopen
 from time import sleep

 FILE  = "publicip"
 SITE  = "http://ipecho.net/plain"
 DELAY = 60 # seconds

 def get_ip():
    while True:
        # wait for DELAY seconds
        sleep(DELAY)

        # get my current public ip
        try:
            ip = urlopen(SITE).read()
        except IOError:
            continue
        # compare with the one in file
        file_value = open(FILE).read()
        if ip != file_value:                 # if they are not equal
            open(FILE, "w").write(ip)        # update the ip in file

 if __name__ == "__main__":
    get_ip()

建议是获取我的公共 ip 并将其存储在一个文件中。 我需要这个脚本循环运行,以便它可以尽快更新文件 ip变了。 如果电源出现故障,我希望它在覆盆子重新启动时运行。所以, 我更新了 /etc/rc.local 文件:

#!/bin/sh -e

/home/pi/bin/script.py
exit 0

之后我使用 sudo reboot 重新启动树莓派。我正在使用腻子 从 Windows 计算机连接到树莓派。再次登录后 我用 ps -e | grep script.py 查看我的脚本是否正在运行,但它是 不是。然后我手动运行脚本,它工作了!

你会怎么解决这个问题?

【问题讨论】:

  • 你给它执行权限了吗?如果没有,并且您手动运行 python /home/pi/bin/script.py,那么这就是您的问题。
  • 是的,它有执行权限。我使用了 chmod 755 script.py

标签: python linux raspberry-pi


【解决方案1】:

在 cron 或 init 中运行的替代方法是使用用户空间监视器。

这个tutorial 很好地展示了supervisor

它真的很容易使用。

apt-get install supervisor
service supervisor restart

添加到/etc/supervisor/conf.d/ip_update.conf

[program:ip_update]
command=/home/pi/bin/script.py
autostart=true
autorestart=true
stderr_logfile=/var/log/ip_update.err.log
stdout_logfile=/var/log/ip_update.out.log

您仍然可以使用supervisorctl 来管理它:

$ supervisorctl
> restart ip_update

【讨论】:

  • 谢谢!主管帮我解决了问题!读取错误日志文件时,我显示找不到 publicip 文件。我只需要提供文件 /home/pi/bin/publicip 的完整路径。
【解决方案2】:

首先验证您的脚本执行权限,如果它具有执行权限。之后,您需要在脚本命令后使用&(运行到无限循环),尝试:

#!/bin/sh
/home/pi/bin/script.py &

更多详情请见raspbian documentation

【讨论】:

  • 感谢您记住我关于 & 的信息。但我这样做的结果是一样的。
  • 在执行前测试脚本的结果是什么?以root身份执行脚本。 sudo su - 然后/home/pi/bin/script.py。检查是否这样,脚本执行。
【解决方案3】:

您的另一个选择是使用 cron
sudo crontab -e 将为您打开 crontab
如果您输入以下条目,您可以将脚本设置为尽可能频繁地运行:
@reboot /home/pi/bin/script.py
它应该在引导过程中运行
其他非数字选项是:

@yearly        Run once a year, "0 0 1 1 *".
@annually      (same as @yearly)
@monthly       Run once a month, "0 0 1 * *".
@weekly        Run once a week, "0 0 * * 0".
@daily         Run once a day, "0 0 * * *".
@midnight      (same as @daily)
@hourly        Run once an hour, "0 * * * *"

标准条目是:

# Minute Hour Day of Month Month  Day of Week   Command
    0     *       *          *        *         /home/pi/bin/script.py
#Once an hour on the hour
    *     *       *          *        *         /home/pi/bin/script.py
#Every minute

编辑:
参考您的评论,使用 cron 执行它意味着您应该在代码中取出时间,因为这就是 cron 正在做的事情。所以你最终会得到类似的东西:

#!/usr/bin/python

 from urllib2 import urlopen

 FILE  = "publicip"
 SITE  = "http://ipecho.net/plain"

 def get_ip():
    try:
        ip = urlopen(SITE).read()
    except IOError:
        continue
    # compare with the one in file
    file_value = open(FILE).read()
    if ip != file_value:                 # if they are not equal
        open(FILE, "w").write(ip)        # update the ip in file

 if __name__ == "__main__":
    get_ip()

参考您现有的代码,我注意到您从不关闭文件,只是一个无限循环,用读取打开它,然后用写入打开它,我不太确定 python 将如何处理它,但它当然不是好习惯。

【讨论】:

  • 谢谢!我试过了,但仍然是同样的问题。问题不在于脚本没有运行。它同时使用 rc.local 方法和 crontab 方法运行。但它随后停止。它应该在无限循环中运行,当我登录时它应该仍在运行。但我认为问题不在于 python 代码,因为它手动运行良好。
  • 也用于调试目的,在代码的关键点输出文本和数据。所以输出 ip、IOERROR 之后的错误消息、file_value 和写入后的一些“成功”文本。在这种情况下,您必须将输出写入文件。编写代码需要几秒钟,您将能够使用 tail -f log.txt 之类的东西来查看代码在做什么。
  • 糟糕,我刚刚注意到您解决了问题。记得接受克里斯蒂亚诺的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2013-02-16
  • 1970-01-01
  • 2022-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多