フォーラムにたくさん出てくる質問の一つです。 Linux端末で実行すると、完全に機能するスクリプトがあります。ただし、再起動時にcrontabで実行するようにすると機能しません。私のスクリプトと同じディレクトリで実行される単純なスクリプトを作成しましたが、実行されず、スクリプトが正しく実行されます。スクリプトは誰でも実行可能で読み取ることができます(chmod 777)。問題はSQLコードのどこかにあると思います。私はこれについて怒っていますが、私のスクリプトで問題を見つけることができないので、質問を「もう一度尋ねる」のです。よろしくお願いします!
ps:このスクリプトは完璧ではありません。最適化が必要な実行中のスクリプトだけです。
クローンタブコード:
@reboot sudo /usr/bin/python /home/pi/AansturingLedGesturctureerd.py
スクリプトコード:
#! /usr/bin/env python
import RPi.GPIO as GPIO
import sys
import time
import MySQLdb
import datetime
# RGB LED pinnen configureren.
pinRood = 27
pinGroen = 22
pinBlauw = 17
# GPIO setup.
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# Zet de GPIO pinnen als uitgang.
GPIO.setup(pinRood, GPIO.OUT)
GPIO.setup(pinGroen, GPIO.OUT)
GPIO.setup(pinBlauw, GPIO.OUT)
# Gebruik PWM op de pinnen.
ROOD = GPIO.PWM(pinRood, 1000)
GROEN = GPIO.PWM(pinGroen, 1000)
BLAUW = GPIO.PWM(pinBlauw, 1000)
ROOD.start(0)
GROEN.start(0)
BLAUW.start(0)
#defienieren functies
def dataUitlezenFile():
global dataAansturingLedGesplitst
bestandAansturingLed = open("/var/www/html/v1.11_layout_aanpassen_login_form_3/extraBestanden/ledAansturing.txt", "r")
dataAansturingLed = bestandAansturingLed.read()
dataAansturingLedGesplitst = dataAansturingLed.split()
#print(dataAansturingLedGesplitst[3])
def dataWissen():
dataWissenFile = open("/var/www/html/v1.11_layout_aanpassen_login_form_3/extraBestanden/ledAansturing.txt", "w")
dataWissenFile.truncate(0)
dataWissenFile.write("0 0 0 niks")
dataWissenFile.close()
def dataUitlezenSQL(dataAansturingLedGesplitst):
global speelTijdActief
global ingesteldeTijd
global tijdDatabase
global tijdVerlopen
#connecteer met de database
connection = MySQLdb.connect (host = "localhost",
user = "******",
passwd = "****",
db = "test")
cursor = connection.cursor()
sqlQuerry = "SELECT stopTijd FROM gespeeldetijd WHERE naam = '" + "Emile" + "' ORDER BY ID DESC LIMIT 1"
rows_count = cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
if (rows_count >= 1):
tijdDatabase = row[0]
#print("true")
else:
tijdDatabase = datetime.datetime.strptime("1685-06-29 08:15:27", '%Y-%m-%d %H:%M:%S')
tijdNu = datetime.datetime.now() #haal de huidige tijd op
#print(tijdNu)
#print(tijdDatabase)
#print(tijdNu)
tijdNu = datetime.datetime.now() #haal de huidige tijd op
cursor = connection.cursor() #ophalen tijd om de relais en de hdmi connector aan te zetten of te onderbreken
sqlQuerry = "SELECT tijd FROM extra WHERE functie = 'uitschakelTijd'"
cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
uitschakeltijd = row[0]
uitschakeltijdString = str(uitschakeltijd)
h, m, s = uitschakeltijdString.split(':')
uitschakeltijdSecondes = int(h) * 3600 + int(m) * 60 + int(s)
uitschakeltijdSecondesNegate = uitschakeltijdSecondes * -1
cursor = connection.cursor() #uitschakeltijd ophalen
sqlQuerry = "SELECT stopTijd FROM gespeeldetijd WHERE naam = 'Emile' ORDER BY ID DESC LIMIT 1"
cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
row_count = cursor.rowcount
if row_count == 0:
tijdDatabaseLaatsteTijd = datetime.datetime.strptime("1685-06-29 08:15:27", '%Y-%m-%d %H:%M:%S')
else:
tijdDatabaseLaatsteTijd = row[0]
if (tijdDatabaseLaatsteTijd < tijdNu): # controleer of de eindtijd is bereikt
#print("eindtijd bereikt")
tijdDatabaseCorrecteNotatie = datetime.datetime.strptime(str(tijdDatabaseLaatsteTijd), '%Y-%m-%d %H:%M:%S') #vorm de tijd om van de database naar een juistee notatie
huidigeTijdCorrecteNotatie = datetime.datetime.now() # correcte notatie van de huidige tijd
overigeTijdSeconden = ((tijdDatabaseCorrecteNotatie-huidigeTijdCorrecteNotatie).total_seconds()) #berekenen van het overige aantal seconden
#print(overigeTijdSeconden)
#print(uitschakeltijdSecondesNegate)
if (overigeTijdSeconden <= uitschakeltijdSecondesNegate): #controleer of de eindtijd al meer als 5 minuten is verlopen
tijdVerlopen = "verlopen"
#print("veel meer seconden verlopen!")
else:
tijdVerlopen = "uitschakeltijd"
#print(tijdVerlopen)
#print("zit nog in de fase")
else:
tijdVerlopen = "verlopen"
#print(tijdVerlopen)
if(tijdVerlopen == "verlopen"):
if (tijdDatabase > tijdNu): # controleer of er een tijd lopende is
speelTijdActief = "actief"
cursor = connection.cursor()
sqlQuerry = "SELECT tijd FROM gespeeldetijd WHERE naam = '" + "Emile" + "' ORDER BY ID DESC LIMIT 1"
rows_count = cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
#print(rows_count)
row = cursor.fetchone()
genre_id_val = cursor.fetchone()
if (rows_count >= 1):
ingesteldeTijd = row[0]
#print("true")
else:
ingesteldeTijd = "00:00:00"
else:
cursor = connection.cursor()
sqlQuerry = "SELECT stopTijd FROM gespeeldetijd WHERE naam = '" + "Thomas" + "' ORDER BY ID DESC LIMIT 1"
rows_count = cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
genre_id_val = cursor.fetchone()
#print(rows_count)
if (rows_count >= 1):
tijdDatabase = row[0]
#print(" 3")
else:
tijdDatabase = datetime.datetime.strptime("1685-06-29 08:15:27", '%Y-%m-%d %H:%M:%S')
#print(" 4")
#print(tijdDatabase)
tijdNu = datetime.datetime.now() #haal de huidige tijd op
#print(tijdNu)
#print(tijdDatabase)
#print(tijdNu)
cursor = connection.cursor() #ophalen tijd om de relais en de hdmi connector aan te zetten of te onderbreken
sqlQuerry = "SELECT tijd FROM extra WHERE functie = 'uitschakelTijd'"
cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
uitschakeltijd = row[0]
uitschakeltijdString = str(uitschakeltijd)
h, m, s = uitschakeltijdString.split(':')
uitschakeltijdSecondes = int(h) * 3600 + int(m) * 60 + int(s)
uitschakeltijdSecondesNegate = uitschakeltijdSecondes * -1
cursor = connection.cursor() #uitschakeltijd ophalen
sqlQuerry = "SELECT stopTijd FROM gespeeldetijd WHERE naam = '" + "Thomas" + "' ORDER BY ID DESC LIMIT 1"
cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
if (row == "none"):
tijdDatabaseLaatsteTijd = row[0]
else:
tijdDatabaseLaatsteTijd = datetime.datetime.strptime("1685-06-29 08:15:27", '%Y-%m-%d %H:%M:%S')
if (tijdDatabaseLaatsteTijd < tijdNu): # controleer of de eindtijd is bereikt
#print("tijd is verlopen, nu gaat andere tijd in")
tijdDatabaseCorrecteNotatie = datetime.datetime.strptime(str(tijdDatabaseLaatsteTijd), '%Y-%m-%d %H:%M:%S') #vorm de tijd om van de database naar een juistee notatie
huidigeTijdCorrecteNotatie = datetime.datetime.now() # correcte notatie van de huidige tijd
overigeTijdSeconden = ((tijdDatabaseCorrecteNotatie-huidigeTijdCorrecteNotatie).total_seconds()) #berekenen van het overige aantal seconden
#print(tijdDatabaseCorrecteNotatie)
#print(huidigeTijdCorrecteNotatie)
#print(overigeTijdSeconden)
if (overigeTijdSeconden >= uitschakeltijdSecondesNegate): #controleer of de eindtijd al meer als 5 minuten is verlopen
tijdVerlopen = "uitschakeltijd"
#print(tijdVerlopen)
else:
tijdVerlopen = "verlopen"
#print(tijdVerlopen)
else:
tijdVerlopen = "verlopen"
#print(tijdVerlopen)
tijdNu = datetime.datetime.now() #haal de huidige tijd op
if (tijdDatabase > tijdNu): # controleer of er een tijd lopende is
speelTijdActief = "actief"
cursor = connection.cursor()
sqlQuerry = "SELECT tijd FROM gespeeldetijd WHERE naam = '" + "Thomas" + "' ORDER BY ID DESC LIMIT 1"
rows_count = cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
genre_id_val = cursor.fetchone()
if (rows_count >= 1):
ingesteldeTijd = row[0]
else:
ingesteldeTijd = "00:00:00"
else:
ingesteldeTijd = "00:00:00"
speelTijdActief = "nietActief"
cursor.close()
connection.close()
def statusSetup():
global setupStatus
#connecteer met de database
connection = MySQLdb.connect (host = "localhost",
user = "root",
passwd = "*****",
db = "test")
cursor = connection.cursor()
sqlQuerry = "SELECT status FROM extra WHERE functie = 'setup'"
cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
dataSetup = row[0]
if (dataSetup == "notCompleted"): # hier gaan we de variabele zetten die zal bepalen welke led aangat
statusSetup = 'setUp'
else:
overbrugStatus = 'setUpCompleted'
cursor.close()
connection.close()
def statusOverbrug():
global overbrugStatus
#connecteer met de database
connection = MySQLdb.connect (host = "localhost",
user = "root",
passwd = "****",
db = "test")
cursor = connection.cursor()
sqlQuerry = "SELECT status FROM extra WHERE functie = 'overbrug'"
cursor.execute (sqlQuerry) #haal de laatst gespeelde tijd op
row = cursor.fetchone()
dataSetup = row[0]
if (dataSetup == "ingeschakeld"): # hier gaan we de variabele zetten die zal bepalen welke led aangat
overbrugStatus = 'overbrug'
else:
overbrugStatus = 'nietOverbrugd'
cursor.close()
connection.close()
while True:
while True:
#nakijken welke data we hebben
#bekijk file die in de data zit
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (statusSetup == 'setUp' ):
while True:
# converteer de waarde 255 tot max 100 voor PWM.
roodwaarde = 0
groenwaarde = 0
blauwwaarde = 100
ROOD.ChangeDutyCycle(roodwaarde)
GROEN.ChangeDutyCycle(groenwaarde)
BLAUW.ChangeDutyCycle(blauwwaarde)
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (dataAansturingLedGesplitst[3] != 'setUp'):
break
if (speelTijdActief == "actief"):
while True:
tijdNu = datetime.datetime.now() #haal de huidige tijd op
h, m, s = ingesteldeTijd.split(':')
ingesteldeTijdSeconden = int(h) * 3600 + int(m) * 60 + int(s)
if(tijdNu <= tijdDatabase):
overigeTijd = tijdDatabase - tijdNu
testTijd = str(overigeTijd)
gesplitsteTijd = testTijd.split('.')
tijdNodig = gesplitsteTijd[0]
h, m, s = tijdNodig.split(':')
overigeTijdSeconden = int(h) * 3600 + int(m) * 60 + int(s)
else:
overigeTijdSeconden = 0
if(ingesteldeTijdSeconden == 0):
percentageOver = -1
else:
percentageOver = float(overigeTijdSeconden)/float(ingesteldeTijdSeconden)*float(100)
print(percentageOver)
if (percentageOver > 50.0):
roodwaarde = 0
groenwaarde = 100
blauwwaarde = 0
ROOD.ChangeDutyCycle(roodwaarde)
GROEN.ChangeDutyCycle(groenwaarde)
BLAUW.ChangeDutyCycle(blauwwaarde)
if (percentageOver <= 50.0 and percentageOver >= 30.0):
roodwaarde = 100
groenwaarde = 100
blauwwaarde = 0
ROOD.ChangeDutyCycle(roodwaarde)
GROEN.ChangeDutyCycle(groenwaarde)
BLAUW.ChangeDutyCycle(blauwwaarde)
if (percentageOver < 30.0 and percentageOver > 10.0):
roodwaarde = 100
groenwaarde = 50
blauwwaarde = 0
ROOD.ChangeDutyCycle(roodwaarde)
GROEN.ChangeDutyCycle(groenwaarde)
BLAUW.ChangeDutyCycle(blauwwaarde)
if (percentageOver <= 10.0 and percentageOver > 0.0):
roodwaarde = 100
groenwaarde = 0
blauwwaarde = 0
ROOD.ChangeDutyCycle(roodwaarde)
GROEN.ChangeDutyCycle(groenwaarde)
BLAUW.ChangeDutyCycle(blauwwaarde)
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (speelTijdActief == "nietActief" or tijdVerlopen == "uitschakeltijd"):
break
if (overbrugStatus == 'overbrug'):
i = 0
while (i <= 255):
roodwaarde = 255
groenwaarde = i
blauwwaarde = 0
ROOD.ChangeDutyCycle(roodwaarde*100/255)
GROEN.ChangeDutyCycle(groenwaarde*100/255)
BLAUW.ChangeDutyCycle(blauwwaarde*100/255)
i = i + 1
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (overbrugStatus != 'overbrug'):
break
i = 255
while (i >= 0):
roodwaarde = i
groenwaarde = 255
blauwwaarde = 0
ROOD.ChangeDutyCycle(roodwaarde*100/255)
GROEN.ChangeDutyCycle(groenwaarde*100/255)
BLAUW.ChangeDutyCycle(blauwwaarde*100/255)
i = i - 1
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (overbrugStatus != 'overbrug'):
break
i = 0
while (i <= 255):
roodwaarde = 0
groenwaarde = 255
blauwwaarde = i
ROOD.ChangeDutyCycle(roodwaarde*100/255)
GROEN.ChangeDutyCycle(groenwaarde*100/255)
BLAUW.ChangeDutyCycle(blauwwaarde*100/255)
i = i + 1
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (overbrugStatus != 'overbrug'):
break
i = 255
while (i >= 0):
roodwaarde = 0
groenwaarde = i
blauwwaarde = 255
ROOD.ChangeDutyCycle(roodwaarde*100/255)
GROEN.ChangeDutyCycle(groenwaarde*100/255)
BLAUW.ChangeDutyCycle(blauwwaarde*100/255)
i = i - 1
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (overbrugStatus != 'overbrug'):
break
if (dataAansturingLedGesplitst[3] == 'niks' and not statusSetup == 'setUp' and not speelTijdActief == "actief" and not overbrugStatus == 'overbrug'):
while True:
#print('uitvoeren')
i = 212
j = 33
while (i >= 33):
while (j <= 212):
if (i >= 33):
groenwaarde = i
else:
groenwaarde = 33
if (j <= 183):
roodwaarde = j
else:
roodwaarde = 183
blauwwaarde = 255
i = i - 1
j = j + 1
ROOD.ChangeDutyCycle(roodwaarde*100/255)
GROEN.ChangeDutyCycle(groenwaarde*100/255)
BLAUW.ChangeDutyCycle(blauwwaarde*100/255)
time.sleep(0.01)
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (not dataAansturingLedGesplitst[3] == 'niks' or statusSetup == 'setUp' or speelTijdActief == "actief"):
break
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
time.sleep(1)
dataUitlezenFile()
dataUitlezenSQL(dataAansturingLedGesplitst)
statusSetup()
statusOverbrug()
if (not dataAansturingLedGesplitst[3] == 'niks' or statusSetup == 'setUp' or speelTijdActief == "actief" or overbrugStatus == 'overbrug'):
break
if (not dataAansturingLedGesplitst[3] == 'niks' or statusSetup == 'setUp' or speelTijdActief == "actief"):
break
答え1
見えない例外処理あなたのコードから。適切に設計されたアプリケーションでは、例外処理とエラー履歴ファイルとして。コードの一部を削除するとスクリプトが実行されますが、これはcronがそれを実行していることを意味します。ログがある場合は、問題を特定した可能性があります。
私が時々することの1つは、スクリプトを自動起動することです。GNU画面セッションを開始すると、画面コンソールに接続して実行中のスクリプトを表示できます。
コードを見ると、ローカルのMysqlインスタンスがあることがわかります。スクリプトの実行時に MySQL がまだ起動していない可能性があります。たぶんそれほど簡単かもしれません。多くの起動スクリプトは、実行時にネットワークまたは他のサービスを常に使用できると誤って想定しています。
より良いアプローチは、独自の方法を作成することです。システムサービスこのスクリプトを実行してください。難しくありません。これでビルドできます。依存関係たとえば、Mysqlサービスなどが開始される前にサービスが実行されないように指定できます。
今、次の手順を実行することをお勧めします。
- クローンジョブの出力を常にファイルに書き込みます。スクリプトはエラーを出力できますが、表示できません。
- 例外処理を追加してスクリプトを改善する(コード10行で十分)
- これにより問題が明らかになります。それから私が提案する残りの部分を考えてみましょう。