【发布时间】:2013-12-21 17:23:04
【问题描述】:
我有一个运行的代码,我在 Raspberry pi 启动时在 crontab 中运行(该代码在 python“空闲”中运行良好)。它有一个无限的while循环。一段时间后,python 脚本停止运行。我在网上搜索并得到了以下可能导致它们的答案
- https://serverfault.com/questions/399029/python-script-stops-responding-when-run-for-a-long-time
- http://www.solutionoferror.com/python/cron-jobbin39-a-python-script-stops-halfway-through-20824.asp(没有回复)
- 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