Raspberry Pi后台程序运行但不起作用

时间:2015-12-12 19:46:34

标签: python raspberry-pi raspbian gpio

已解决:出于某种原因,让CRON运行一个运行python脚本的bash脚本解决了这个问题。

我有一个python脚本" temperature.py"这是一个无限循环,用于检查来自GPIO引脚的值,将值添加到文件中,然后使用" gdrive"上传到google驱动器。有时使用smtp发送邮件。如果我从SSH终端($ sudo python temperature.py)运行它,该脚本可以正常工作,但它在启动时并不像我希望的那样工作。 我正在使用raspbian wheezy。

我做了什么:

/etc/rc.local中的

#...
#...

sleep 10
python /home/pi/temperature.py&
exit 0

pi正常启动,在我使用SSH登录后写:

...$ps aux

我得到:

...
root   2357   1.4   1.9   10556   8836 ?    S 21:11   0:12 python /home/pi/temperature.py
...

因此我猜测它正在运行,它使用1.4%的CPU,这是非常少的,但几乎所有其他进程都使用0.0%。既然程序可能 它没有做任何事情......我的谷歌驱动器是空的......

所以如果我从终端运行它作为背景它是有效的但是如果我从rc.local运行它就没有...

我在猜测:

  1. 它缺少一些许可吗?

  2. 它一定是rc.local的东西...因为它从终端完美运行

    的结果

    ... $ ls -l temperature.py -rwxr-xr-x 1 root root 1927 Dec 12 21:10 temperature.py ... $ ls -l /etc/rc.local -rwxr-xr-x 1 root root 373 Dec 12 20:54 /etc/rc.local

  3. 我曾尝试使用cron($ sudo crontab -e)来盯着它,但它也没有用。

    有什么想法吗?我觉得我错过了一些显而易见的东西,但由于我对raspberry pi和linux的东西很新,我无法在google上找到它。

    脚本temperature.py

    #Made by Matthew Kirk
    # Licensed under MIT License, see
    # http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/temperature/LICENSE
    #Adapted by me
    
    import RPi.GPIO as GPIO
    import time
    import subprocess
    import os
    import commands
    import sys
    import smtplib
    from email.mime.text import MIMEText
    
    print 'TEMPERATURE LOGGER - M'
    print ' '
    #MAILER SETUP
    to = '****@gmail.com'
    gmail_user = '****@gmail.com'
    gmail_password = '*****'
    smtpserver = smtplib.SMTP('smtp.gmail.com',587)
    
    #TEMP LOGGER GPIO
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(7,GPIO.IN)
    
    while True:
        print 'fail'
        if GPIO.input(7):
                break
    
    while GPIO.input(7):
        pass
    
    waitTime = 60
    
    tempTreshold = 50
    logFile  = "/home/pi/tDat.csv"
    while True:
        dataFile = open(logFile,"a")
        time_1 = time.time()
        tFile = open("/sys/bus/w1/devices/28-011582ac5dff/w1_slave")
        text = tFile.read();
        tFile.close();
    
        tData = text.split("\n")[1].split(" ")[9]
        temp = float(tData[2:])
        temp = temp/1000
        timeStamp = time.strftime("%d/%m/%Y %H:%M:%S")
        dataFile.write(str(temp)+","+ timeStamp+ "\n")
        dataFile.close()
        file_ID = commands.getoutput('drive list | tail -n +2 | head -1 | awk \'{print $1;}\' ')
        cmd = 'drive delete --id '+file_ID
        os.system( cmd )
        cmd = 'drive upload --file '+logFile
        os.system( cmd )
     # MAIL IF TEMP TOO LOW
        if temp < tempTreshold:
                smtpserver.ehlo()
                smtpserver.starttls()
                smtpserver.ehlo()
                smtpserver.login(gmail_user,gmail_password)
                msg = MIMEText('The temperature in Branten, {}C, is below {} degrees C!!!'.format(temp,tempTreshold)+'\n'+'Recorded$
                msg['Subject'] = 'Branten Temperature Warning'
                msg['From'] = gmail_user
                msg['To'] = to
                smtpserver.sendmail(gmail_user,[to],msg.as_string())
                smtpserver.quit()
    
        sys.exit()
    

    和CRON:

    * * * * * python /home/pi/temperature.py
    

2 个答案:

答案 0 :(得分:3)

考虑修改代码以不使用infinate循环。

了解Linux CRON作业。 CRON是一种服务,它将按计划(正确)执行您的程序或脚本。编辑:它默认安装在大多数Linux发行版上,包括Rasbian。

Some good examples

答案 1 :(得分:0)

也许nohup有帮助吗?

nohup python /home/pi/temperature.py&