Raspberry Pi / Python代码通过终端按预期运行,在启动时通过crontab

时间:2018-03-20 03:03:48

标签: python cron raspbian

对于大部分内容我都是新手,从linux和python到电子产品和rasberry pi ......系统是运行最新rasbian操作系统的覆盆子pi,启动到LXDE。

我有一个相当简单的python代码,用于检查三种服务的状态,apache2,mysql和vsftpd,并将发出信号以打开/关闭双色红/绿LED。在服务检查之前,我添加了一点以使所有三个指示灯闪烁黄色几秒钟。代码如下:

    import os, time, subprocess
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)

    GPIO.setup(7, GPIO.OUT)
    GPIO.setup(11, GPIO.OUT)
    GPIO.output(7, False)
    GPIO.output(11, False)

    GPIO.setup(12, GPIO.OUT)
    GPIO.setup(16, GPIO.OUT)
    GPIO.output(12, False)
    GPIO.output(16, False)

    GPIO.setup(18, GPIO.OUT)
    GPIO.setup(22, GPIO.OUT)
    GPIO.output(18, False)
    GPIO.output(22, False)

    def LED_G():
        GPIO.output(11, True)
        GPIO.output(16, True)
        GPIO.output(22, True)
        GPIO.output(7, False)
        GPIO.output(12, False)
        GPIO.output(18, False)

    def LED_R():
        GPIO.output(11, False)
        GPIO.output(16, False)
        GPIO.output(22, False)
        GPIO.output(7, True)
        GPIO.output(12, True)
        GPIO.output(18, True)
    def LED_Y():
        GPIO.output(11, False)
        GPIO.output(16, False)
        GPIO.output(22, False)
        GPIO.output(7, False)
        GPIO.output(12, False)
        GPIO.output(18, False)

    def LED_OFF():
        GPIO.output(11, True)
        GPIO.output(16, True)
        GPIO.output(22, True)
        GPIO.output(7,  True)
        GPIO.output(12, True)
        GPIO.output(18, True)

    def initializeLED():
        for x in range(0,8):
            LED_Y()
            time.sleep(.100)
            LED_OFF()
            time.sleep(.100)

    def is_service_running(name):
        with open(os.devnull, 'wb') as hide_output:
            exit_code = subprocess.Popen(['service', name, 'status'], stdout=hide_output, stderr=hide_output).wait()
            return exit_code == 0

    def set_status_LED():
        if not is_service_running('apache2'):
            GPIO.output(12, False) #Red ON
            GPIO.output(16, True)  #Green OFF
        else:
            GPIO.output(12, True)  #Red OFF
            GPIO.output(16, False) #Green ON

        if not is_service_running('mysql'):
            GPIO.output(18, False) #Red ON
            GPIO.output(22, True)  #Green OFF
        else:
            GPIO.output(18, True)  #Red OFF
            GPIO.output(22, False) #Green ON

        if not is_service_running('vsftpd'):
            GPIO.output(7,  False) #Red ON
            GPIO.output(11, True)  #Green OFF
        else:
            GPIO.output(7,  True)  #Red OFF
            GPIO.output(11, False) #Green ON

    initializeLED()
    while True:
        set_status_LED()

当我在终端python service_status_led.pypython service_status_led.py &中运行代码时,一切都按预期运行。灯闪烁黄色,最后变红或变绿。检查状态功能在无限循环中运行,因此如果服务发生故障,灯将相应地改变。

我做了cp service_status_led.py /bin/,然后sudo crontab -e添加了@reboot python /bin/service_status_led.py(也完成了&)..重新启动系统,LED开始闪烁,但是将不会进入无限系统检查的下一步..我已经改变了' initializeLED'的序列。功能,并发现无论功能结束的颜色,红色,绿色,黄色或关闭,灯是如何出现的。它似乎没有进入循环。我试图删除循环,只是在初始化序列后进行一次检查,但它也不会这样做。

我一直在寻找解决这个问题的相当多的东西,并且无法找到解决方案,对不起,如果之前有人问过这个问题

- 更新: 按照Klaus D。的建议,我放弃了crontab并使用systemd进行了解决。正如我在评论中所说,它最初工作,重启后没有。花了一些时间挖掘,尝试这个和那个。最终通过journalctl,我发现错误发生在我的myservice.service文件,WorkingDirectoryExecStart

从:

    [Service]
    ExecStart=/usr/bin/python3 -u main.py
    WorkingDirectory=/custom/LEDSS

为:

    [Service]
    ExecStart=/usr/bin/python /custom/LEDSS/service_status_led.py

我做的另一件事是确保.service文件的权限是正确的。我不确定它们之前是否不正确,但将chmod 644 myfile.service以及上述更改设置为文件本身。

一切都在运转!在https://www.raspberrypi-spy.co.uk/2015/10/how-to-autorun-a-python-script-on-boot-using-systemd/

找到我的结果 克劳斯,感谢帮助我指引正确的方向。

0 个答案:

没有答案