rc.local [Errno -3] Temporary failure in name resolution

Ein neuer Artikel wurde veröffentlicht
  • Hallo zusammen,


    Ich hoffe auf diesem Weg zu einer Lösung zu gelangen. Seid längerem versuche ich einen Autostart von einem python-Programm über die rc.local Datei zurealisieren.


    In der dazugehörigen Log-Datei des Python Skripts wird folgende Exception ausgegeben: [Errno -3] Temporary failure in name resolution


    Über systemctl status rc-local wird dies ausgegeben:


    Mich verwundert nur, das das Programm einwandfrei manuell startet aber nicht über die rc.local Datei.


    Vielen Dank im voraus,

    JackerNils

  • Da wird zum Systemstart einfach das netztwerk noch nicht da sein. Ein sleep in der rc.local wirkt manchmal wunder - es gibt glaube auch eine "wait for network" Methode, die mir grad nicht einfällt.

  • Hallo,


    rc.local ist der veraltete Weg und das `sleep` ist ein Würg-Around.


    Wie du ja siehst, wird rc.local von systemd interpretiert. Also kannst du statt rc.local auch den aktuellen / zeitgemäßen Weg über eine systemd Service Unit nehmen. Darin kannst du über die passenden Direktiven auch selber festlegen, wann dein Skript gestartet wird - ohne drauf hoffen zu müssen, dass deine `sleep` Zeit lang genug ist usw.

    Außerdem kannst du über systemd auch so Sachen wie automatischen Neustart des Skripts im Falle eines Crashs regeln usw.


    Gruß, noisefloor

  • Hallo,


    dbv : hier geht es um das Problem von JackerNils, wo sehr offensichtlich systemd zum Einsatz kommt. Alles weitere ist hier nicht relevant bzw. verwässert den Thread. Wenn du Fragen zu "wie mache ich das mit Debian ohne systemd?" starte bitte einen neuen Thread, dann können wir das da diskutieren.


    Gruß, noisefloor

  • Hallo,


    Ich habe mich nun an systemd herangewagt. Das Programm wird auch ordnungsgemäß ausgeführt, jedoch wird nicht auf die Internetverbindung gewartet.

    Folgendes ist meine main.service Datei in /lib/systemd/system/:

    Auch in der Log-Datei ist ein Networkfehler zuerkennen.


    Gruß

    Nils

  • Habe nun in meinem Python-Skript folgende Zeilen vorausgesetzt:


    Code
    1. connected = False
    2. response = ""
    3. while connected == False:
    4. try:
    5. response = urllib2.urlopen('http://216.58.192.142',timeout=1)
    6. logger.info("Internet-Verbindung vorhanden!")
    7. connected = True
    8. except urllib2.URLError as error :
    9. logger.debug("Keine Verbindung! " + str(response) + " " + str(error))
  • Hallo,


    ok - wobei ein passende Direktive in der ServiceUnit "stilvoller" ist :-)


    Zum Skript:


    Eingerückt wird immer mit vier Leerzeichen, nicht mit 8.

    Zeile 2 ist sinnlos, kannst du löschen.

    Verwendest du `response` später irgendwo? Sonst kannst du in Zeile 5 den Rückgabewert auch an die "Wegwerfvariable" _ (Unterstrich) binden.

    Strings formatiert man mit der `format` Methode, nicht mit + Zeichen.


    Gruß, noisefloor

  • while connected == False:

    Das muss korrekterweise while connected is False: oder besser noch while not connected: heißen!

    Strings formatiert man mit der `format` Methode, nicht mit + Zeichen.

    :thumbup:

    Bedeutet konkret:

    Python
    1. logger.debug("Keine Verbindung! {0} {1}".format(response, error))