domain-socket "sendto" Begegnung "errno 111, connection refused"
Ich bin mit domain-socket, um Werte aus einem anderen Prozess, wie Eine um einen Wert von B, Es funktioniert gut für Monate. Aber vor kurzem, ist fehlgeschlagen, während der "sendto" - Nachricht an B mit "errno 111, connection refused" gelegentlich.
Ich habe in der B-domain-socket-bind-Datei, es ist vorhanden. Ich habe auch ein paar tests machen in einem anderen Rechner, funktioniert auch gut. Also, hat jemand dieses problem Auftritt bevor? Kann jemand ein paar Hinweise, was könnte wohl falsch in diesem Szenario? Dank sehr viel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als ich gesehen habe diesen Fehler mit unix-domain-sockets, ist es in der Regel, weil der Prozess B nicht ausgeführt wird, oder es gibt einen Konflikt in der Verbindung Pfade. (Wenn B stirbt, macht es automatisch neu starten? Ist es möglich, dass die Fehler passiert sind, während B gestorben ist, aber noch nicht neu gestartet?). Eine andere Möglichkeit: ist es möglich, dass mehrere Kopien Einer laufen zur gleichen Zeit? Man kann die ECONNREFUSED-Fehler, wenn B die Warteschlange der noch nicht akzeptierten verbindungen voll ist.
Ich würde vorschlagen, laufen die beiden Prozesse A und B unter
strace
entweder:oder, wenn der Prozess bereits läuft,
Auch,
geben Sie den status aller unix domain sockets im system vorhanden sind.
netstat -nap
(wenn es als root ausgeführt) wird, zeigen auch die Vorgänge um diese sockets.Betrachten unter
/proc/<pid-B>/fd
und sehen, ob B ausgeführt wird out-of-file-Deskriptoren. Wenn ja, haben Sie ein Ressource-Leck und säubern müssen. Es sollte nicht sein ein problem mit UDP Programmen, aber Lustiger Dinge bekannt gewesen sein.lsof
vielleicht ein anderes tool zu verwenden.Sonst hast du vernünftige Vorschläge von anderen Menschen -
netstat
insbesondere sollte helfen.Beachten Sie, dass die Steckdosen in der Datei system nicht automatisch gelöscht, wenn der Letzte Deskriptor für Sie geschlossen ist. Versuchen zu verbinden oder zu senden, zu dieser Zeit wird Fehler verursachen. Die server werden müssen, entfernen Sie die Buchse in der Datei-system, bevor es erneut.
Prozess B nicht mehr auf die andere Seite Ihres (vermutlich DGRAM) socket-vielleicht ist es gestorben, oder geschlossen das filehandle, etc.
sendto(2)
auf linux zurück ECONNREFUSED für ein oder SOCK_DGRAM SOCK_SEQPACKET unix-domain-socket, wenn der Empfänger tot ist. (SOCK_STREAM unix-sockets wird dies nicht tun-Sie wird stattdessen zurückgeben ENOTCONN.)