socket.connect beim Systemstart

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
scooter757
User
Beiträge: 4
Registriert: Mittwoch 20. August 2014, 11:26

Hallo liebes Forum!

Ich habe ein Problem mit meinem Programm: Es wird beim Systemstart (Runlevel 2, Raspberry pi) gesstartet und soll Daten an Logstash schicken. Ich habe 2 Funktionen: Logstash_send_int und logstash_send_ups. (Daten einer USV) Beide Funktionen machen im Prinzip das selbe:

Code: Alles auswählen

def logstash_send_int(self, key, value): #Wert (Zahl) an Logstash senden
		protocol = socket.SOCK_STREAM #TCP als Standart
		if Logstash_PROTOCOL == "udp":
			protocol = socket.SOCK_DGRAM #Protokoll nach upd ändern

		s = socket.socket(socket.AF_INET, protocol) 
		s.connect((Logstash_IP, int(Logstash_PORT))) #Verbinden
		s.send("{  \"" + key + "\": " + str(value) + "}\n")
		s.close()

def logstash_send_ups(self, nr, values): #json-string mit den USV-Daten senden
		protocol = socket.SOCK_STREAM #TCP als Standart
		if Logstash_PROTOCOL == "udp":
			protocol = socket.SOCK_DGRAM

		s = socket.socket(socket.AF_INET, protocol) 
		s.connect((Logstash_IP, int(Logstash_PORT)))
		ret = "{\"ups" + str(nr) + "\": {"
		ret += ".."		

		s.send(ret) #senden
		s.close()
Wenn ich das Programm von Hand aufrufe, funktioniert alles, wenn ich es vom System starten lasse, bekomme ich ein Fehler bei "s.connect..:", aber nur bei logstash_send_int. Die e.message ist leer, ich bekomme nur die Zeile. Die Daten von Logstash_send_ups kommen an. Im Hauptprogramm rufe ich ein Thread auf, welcher dann Logstash_send_ups aufruft, Logstash_send_int wird "normal" aufgerufen. Das Ganze läuft noch als Dämon (falls das interessant ist). Ich habe keine Ahnung, warum ein einmal geht und einmal nicht, da das netzwerk ja schon geladen ist (muss ja, einmal gehts ja) und wieso das funktioniert, wenn ich den Dämon von Hand starte.

Kann mit jemand weiterhelfen?? :(

Finn
BlackJack

@scooter757: Was ist denn bitte die `e.message`? Und wie sieht der Fehler aus? Gibt es da eine Ausnahme? Welche? Kompletten Traceback bitte.

Die beiden Methoden enthalten für meinen Geschmack zu viel gleichen Quelltext. Das senden von einer JSON-Nachricht kann man da in eine eigene Funktion oder Methode herausziehen.

Und *bitte*: Kein JSON manuell zusammenfummeln. Dafür gibt es das `json`-Modul.

Das Protokoll müsste ja in beiden Fällen das selbe sein. Denn bei UDP dütfte der Code Probleme machen, denn UDP kennt keine Verbindungen.
scooter757
User
Beiträge: 4
Registriert: Mittwoch 20. August 2014, 11:26

Ok, das ist alles nen bisschen schnell zusammengeschrieben, das json-Modul wird nachgerüstet! :) Die Auswahl nach UDP habe ich jetzt rausgenommen. Aber da ich das als Dämon starte, bekomme ich keine Meldungen, der Prozess wird einfach beendet. ich habe um den Aufruf ein try-except-block:

Code: Alles auswählen

 try:
	self.logstash_send_int(Logstash_Key[0],temperatur)
except Exception, e:
	logAPI.error(e.message + "line: " + str(sys.exc_traceback.tb_lineno))
Damit bekomme ich die Zeile, aber keine Nachricht: [2014-08-20T13:08:17]-[ERROR] line: 55
Gibt es eine Möglichkeit da mehr Informationen herauszubekommen?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

kannst den kompletten Traceback als String an log weitergeben. Schau dir mal https://docs.python.org/2/library/traceback.html an.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
scooter757
User
Beiträge: 4
Registriert: Mittwoch 20. August 2014, 11:26

Hier ist der Traceback:

[2014-08-20T14:19:59]-[ERROR] Traceback (most recent call last):
File "/etc/API/API.py", line 56, in logstash_send_int
s.connect((Logstash_IP, int(Logstash_PORT)))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 113] No route to host

Komisch ist ja, das es ja teilweise funktioniert..
scooter757
User
Beiträge: 4
Registriert: Mittwoch 20. August 2014, 11:26

So, Problem gelöst :evil: :D

Und zwar hatte ich den Dämon 10 Sekunden verspätet starten lassen. Da mit das zu lange wurde, immer auf die Neustarts zu warten, habe ich die Verzögerung weggemacht. Dabei ist mir aufgefallen, dass, wenn der Dämon ein bisschne länger läuft, keine Fehlermeldungen mehr kommen. Also wieder 10 Sekunden verspätet starten lassen und siehe da: weniger Fehler. :D Habe jetzt 30 Sekunden Timeout am Anfang, dann funktioniert alles Prima. So wie es aussieht braucht der Pi ein bisschen um die seine Netzwerkschnittstelle zu initialisieren.

Trotzdem vielen Dank für die Hilfe und den Hinweiß auf das json-Modul :D
Antworten