【问题标题】:Python script stops running in crontab after sometime一段时间后,Python 脚本停止在 crontab 中运行
【发布时间】:2013-12-21 17:23:04
【问题描述】:

我有一个运行的代码,我在 Raspberry pi 启动时在 crontab 中运行(该代码在 python“空闲”中运行良好)。它有一个无限的while循环。一段时间后,python 脚本停止运行。我在网上搜索并得到了以下可能导致它们的答案

  1. https://serverfault.com/questions/399029/python-script-stops-responding-when-run-for-a-long-time
  2. http://www.solutionoferror.com/python/cron-jobbin39-a-python-script-stops-halfway-through-20824.asp(没有回复)
  3. Cron jobbin' a python script: stops halfway through

在这一点上,我真的很困惑背后的原因是什么。我需要帮助来理解这背后的原因。还有什么是在启动树莓派时运行此代码的最佳方式。 crontab 是否需要任何调整或是否有其他方法?本人是EE专业的,对linux、raspberry pi(刚开始使用)和python不太熟悉,请详细回答。代码如下:

import threading
import os
import time
import serial
import httplib
import math

#GPS data
os.chdir('/home/pi/Desktop')

#Distance function
def Distance(lat1, long1,lat2,long2):

    degree_to_rad = float(math.pi / 180.0)

    d_lat = (lat2 - lat1) * degree_to_rad
    d_long = (long2 - long1) * degree_to_rad

    a = pow(math.sin(d_lat / 2), 2) + math.cos(lat1 * degree_to_rad) * math.cos(lat2 * degree_to_rad) * pow(math.sin(d_long / 2), 2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    km = 6367 * c
    mi = 3956 * c

    return km

#global variables
global ser
global recieveBuffer
global recieveFlag
global webAddress
global data

#Serial Communication Settings
baud = 9600;
#port = 'Com4'
port ='/dev/ttyAMA0'

#default WebAddress and Data
webAddress = "gpsmaster.eu5.org"
webData = "/post.php?"

#Lat and Lng Coordinates, Initialied at Gate
lat=31.470997
lng=74.411116
lumsLat=31.470997
lumsLng=74.411116


ser = serial.Serial(port, baud)
if not ser.isOpen():
    ser.open()


recieveBuffer="NULL"
recieveFlag=0

def shutDown():
    os.system("sudo shutdown -h now")

def readSerial():
    global recieveBuffer
    global recieveFlag
    global ser
    while True:
        recieveBuffer = ser.readline()
        recieveFlag=1

# Function to Post Data, Return Y for success, N for failure
def httpGet(webAddress,webData):
    try:
        #print(webAddress)
        #print(webData)
        conn = httplib.HTTPConnection(webAddress)
        conn.request("GET",webData)
        res = conn.getresponse()
        #print res.status, res.reason
        conn.close()
    except:
        print("Exceptoion!!")
        return ['N','Failed']
    else:
        return ['Y',res]


def replayMaster(ser,recieved):
    global lat
    global lng
    recieved=recieved.replace("\n", "")
    recieved=recieved.replace("\r", "")
    tokenized = recieved.split(',');
    command = tokenized[0]
    if command=='AT':
        ser.write('<OK>')
    elif command=='POST':
        if lat!=0 and lng != 0: # and Distance(lumsLat,lumsLng,lat,lng)<50
            lat = float(tokenized[1])
            lng = float(tokenized[2])
            ans = httpGet(webAddress,"%slat=%f&lng=%f" % (webData, lat,lng))
            #with open("logFile.txt","a") as fileStream:
             #   fileStream.write("%s,%f,%f\r\n" % (ans[0],lat,lng))
            #fileStream.close()
            if ans[0]=='N':
                ser.write('<ERROR>')
            else:
                ser.write('<'+`ans[1].status`+'>')
        else:
            ser.write('<Invalid Coordinates>')
            print ("Invalid Coordinates")
    elif command=='CLOSE':
        ser.close()
    elif command=='HALT':
        ser.write('<Shutting Down>');
        shutDown()
    else:
        ser.write('<Unknown Command>')


serialReadThread = threading.Thread(target=readSerial)
serialReadThread.start()


ser.write('<OK>')
while True:
    #p#rint Distance(31.470997,74.411116,31.469723,74.512244)
    if recieveFlag:
        replayMaster(ser,recieveBuffer)
        print(recieveBuffer)
        recieveFlag=0
    print("waiting: |%f|,|%f|"%(lat,lng))
    time.sleep(0.4)

【问题讨论】:

  • 您是否尝试过您提到的任何可能的解决方案?
  • 不,我没有,我想在做某事之前绝对确定。我不想弄乱我的 pi。
  • 为什么会弄乱你的 pi?您可以随时重置 SD 卡的内容(以防它真的无法重新开始)。

标签: python linux python-2.7 raspberry-pi crontab


【解决方案1】:

我的 crontab 也有一些问题。我在重启后使用了很短的时间延迟来修复它。

@reboot (sleep 10; python3 ABSOLUTE_PATH/example.py)

也许这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2018-08-06
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多