python 스크립트가 crontab에서 실행되지 않습니다.

python 스크립트가 crontab에서 실행되지 않습니다.

포럼에 많이 올라오는 질문 중 하나입니다. 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줄이면 충분)
  • 이렇게 하면 문제가 분명해집니다. 그런 다음 제가 제안하는 나머지 사항을 생각해 보세요.

관련 정보