Почему перестал работать фоновый планировщик? - PullRequest
0 голосов
/ 07 октября 2019

Я запускаю скрипт Python для проверки интернет-соединения в сети Wi-Fi. Он запускается каждые 10 минут. Примерно через месяц работы планировщик не вызывает фактическую функцию по следующей причине:

2019-08-27 14:13:27,259 : Next wakeup is due at 2019-08-27 14:23:27.254425+00:00 (in 599.996401 seconds)
2019-08-27 14:23:27,257 : Looking for jobs to run
2019-08-27 14:23:27,258 : Execution of job "checkwifi (trigger: interval[0:10:00], next run at: 2019-08-27 14:23:27 UTC)" skipped: maximum number of running instances reached (1)
2019-08-27 14:23:27,259 : Next wakeup is due at 2019-08-27 14:33:27.254425+00:00 (in 599.996381 seconds)
2019-08-27 14:33:27,257 : Looking for jobs to run
2019-08-27 14:33:27,258 : Execution of job "checkwifi (trigger: interval[0:10:00], next run at: 2019-08-27 14:33:27 UTC)" skipped: maximum number of running instances reached (1)

При поиске этой ошибки я обнаружил, что это происходит только тогда, когда сценарий зависает более чем на10 минут, но в моем сценарии я не нашел причин повесить сценарий на 10 или более минут. Основная проблема заключается в том, что фоновый планировщик не восстанавливается после этой проблемы. На самом деле, если это произойдет, он должен запустить следующий экземпляр после завершения зависания, но здесь этого не происходит. Таким образом, мы должны предположить, что скрипт завис на 2 дня.

Можно ли повесить скрипт на 2 дня?

Сценарий приведен ниже.

import commands as cm
import netifaces as ni
import requests,socket,logging
from logging.handlers import RotatingFileHandler
import signal
from apscheduler.schedulers.background import BackgroundScheduler        

log_formatter = logging.Formatter('%(asctime)s : %(message)s')
logFile = 'output.log'

rotate_handler = RotatingFileHandler(logFile, mode='a', maxBytes=1024*1024, 
                                 backupCount=1)
rotate_handler.setFormatter(log_formatter)

Logging = logging.getLogger()
Logging.setLevel(logging.DEBUG)
Logging.addHandler(rotate_handler)

print "ddd"

def checkwifi():
    URL="http://webauth-wlc.lacounty.co/login.html"
    checkURL="https://www.google.co.in/"

    d={}
    d["buttonClicked"]='4'
    d["redirect_url"]="http://dhs.lacounty.gov/wps/portal/dhs"
    d["err_flag"]='0'

    net=''
    port=53
    host="8.8.8.8"
    timeout=90
    i=1
    restartwifi=0

    while i<=4:

        try:
            Logging.debug('Checking Internet Try : %s'%i)
            ssid=cm.getoutput('iwgetid -r')
            IPaddr=ni.ifaddresses('wlan0')[ni.AF_INET][0]['addr']
        except Exception as e:
            Logging.debug('Read error in ssid and Ipaddress')
            Logging.debug(repr(e))
            IPaddr=''

        Logging.debug("SSID : "+ssid)
        Logging.debug("IP : "+IPaddr)

        try:
            socket.setdefaulttimeout(timeout)
            socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
            r=requests.get(checkURL,timeout=timeout)
            sure="""<html itemscope="" itemtype="http://schema.org/WebPage" lang="en-IN">"""

            if sure in r.text:
                Logging.debug("Getting google.com")                             ## validate coz it may redirect to captive portal login page.
                net=True

            else:
                Logging.debug("Not getting google.com")
                net=False

        except Exception as ex:
            net=False

        if net==False:
            Logging.debug("NO INTERNET")
            if ssid=='DHS_Guest':
                Logging.debug('Giving request to DHS_Guest for internet')
                try:
                    r=requests.post(URL,data=d)
                    Logging.debug("DONE : status_code = %s"%r.status_code)
                except Exception as e:
                    Logging.debug("Error Occured : \n"+repr(e))
                    restartwifi=1

            else:
                if ssid:
                    Logging.debug("STATUS : network is not DHS_Guest")
                    break               ##if connected other network break
                else:
                    restartwifi=1
                    Logging.debug("STATUS : Not connected to any network")

        elif net==True:
            Logging.debug("STATUS : ALREADY CONNECTED TO INTERNET")
            break

        if restartwifi==0:
            try:
                socket.setdefaulttimeout(timeout)
                socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
                r=requests.get(checkURL,timeout=timeout)
                sure="""<html itemscope="" itemtype="http://schema.org/WebPage" lang="en-IN">"""
                if sure in r.text:
                    Logging.debug("STATUS : INTERNET CONNECTED")
                    net=True
                    break
                else:
                    Logging.debug("STATUS : NOT SUCCESSFUL")
                    net=False

            except Exception as ex:
                net=False
                Logging.debug("STATUS : NOT SUCCESSFUL")



        if i==4:
            break


        if i==3 or restartwifi==1:
            restartwifi=0
            Logging.debug("Restarting wlan0")
            try:
                status1=cm.getstatusoutput('sudo systemctl daemon-reload')
                status2=cm.getstatusoutput('sudo systemctl restart networking.service')
                status3=cm.getstatusoutput('sudo ifdown wlan0')
                status3=cm.getstatusoutput('sudo ifup wlan0')
                Logging.debug("%s,%s,%s"%(status1[0],status2[0],status3[0]))
            except Exception as e:
                Logging.debug("Restarting ERROR : "+repr(e))



        i=i+1
        net=''
    return net

if __name__=="__main__":
    try:
        checkwifi()
        doit=BackgroundScheduler()
        doit.add_job(checkwifi,'interval',minutes=13,id='caportal')
        doit.start()
        signal.pause()
    except Exception as e:
        Logging.debug("Function call ERROR : "+repr(e))

Как решить эту проблему?

...