포럼에 많이 올라오는 질문 중 하나입니다. 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이 이를 실행하고 있다는 뜻인데, 오류가 발생하면 추적이 되지 않아 조사가 어려울 것이라고 하셨습니다. 로그가 있다면 문제를 파악했을 수도 있습니다.
내가 가끔 하는 일 중 하나는 스크립트를 자동 시작하는 것입니다.GNU 화면세션을 시작하면 화면 콘솔에 연결하여 실행 중인 스크립트를 볼 수 있습니다.
코드를 살펴보면 로컬 Mysql 인스턴스가 있는 것을 알 수 있습니다. 스크립트가 실행될 때 MySQL이 아직 시작되지 않았을 수 있습니다. 어쩌면 그렇게 간단할 수도 있습니다. 많은 시작 스크립트는 실행 시 네트워크나 다른 서비스를 항상 사용할 수 있다고 잘못 가정합니다.
더 나은 접근 방식은 자신만의 방법을 만드는 것입니다.시스템 서비스이 스크립트를 실행하세요. 어렵지 않습니다. 이렇게 하면 빌드할 수 있습니다.종속성예를 들어, Mysql 서비스 등이 시작되기 전에 서비스가 실행되지 않도록 지정할 수 있습니다.
이제 다음 단계를 수행하는 것이 좋습니다.
- 크론 작업의 출력을 항상 파일에 기록하십시오. 스크립트에서 오류가 출력될 수 있지만 볼 수는 없습니다.
- 예외 처리를 추가하여 스크립트 개선(코드 10줄이면 충분)
- 이렇게 하면 문제가 분명해집니다. 그런 다음 제가 제안하는 나머지 사항을 생각해 보세요.