2010-05-18 3 views
7

Ich benutze Domain-Socket, um Werte von einem anderen Prozess, wie A, um einen Wert von B zu bekommen, Es funktioniert gut für Monate. Aber kürzlich, A ist fehlgeschlagen während "sendto" Nachricht an B mit "errno 111, Verbindung verweigert" gelegentlich.Domain Socket "sendto" Begegnung "errno 111, Verbindung verweigert"

Ich überprüft die B-Domäne Socket-Bindedatei, es ist vorhanden. Ich mache auch ein paar Tests in einer anderen Maschine, funktioniert auch gut. Also, findet jemand dieses Problem vor? Kann jemand Hinweise haben, was in diesem Szenario wahrscheinlich falsch ist? Vielen Dank.

Antwort

3

Wenn ich diesen Fehler mit Unix-Domain-Sockets gesehen habe, ist es in der Regel, weil der Prozess B nicht ausgeführt wird oder die Verbindungspfade nicht übereinstimmen. (Wenn B stirbt, wird es automatisch neu gestartet? Ist es möglich, dass die Fehler passieren, während B gestorben ist, aber noch nicht neu gestartet wurde?). Eine andere Möglichkeit: Ist es möglich, dass mehrere Kopien von A gleichzeitig laufen? Sie erhalten möglicherweise den ECONNREFUSED-Fehler, wenn Bs Warteschlange der noch nicht akzeptierten Verbindungen voll ist.

würde ich vorschlagen, beide Verfahren A und B unter strace läuft, entweder:

strace -o A.log A 

oder, wenn der Prozess bereits ausgeführt wird,

strace -o B.log -p <process-id-of-B> 

Auch

netstat -na 

gibt Ihnen den Status aller Unix-Domain-Sockets, die im System vorhanden sind.

+0

'netstat -nap' (wenn als root ausgeführt) wird auch die mit diesen Sockets verbundenen Prozesse anzeigen. – bstpierre

1

Beachten Sie, dass Sockets im Dateisystem nicht automatisch gelöscht werden, wenn der letzte Deskriptor zu ihnen geschlossen ist. Der Versuch, zu diesem Zeitpunkt eine Verbindung herzustellen oder zu senden, führt zu Fehlern. Der Server muss den Socket im Dateisystem entfernen, bevor er erneut binden kann.

2

Betrachten Sie unter und sehen, ob B keine Dateideskriptoren mehr hat. Wenn ja, haben Sie ein Ressourcenleck und müssen aufräumen. Es sollte kein Problem mit UDP-Programmen sein, aber lustigere Dinge sind bekannt. lsof könnte ein anderes Werkzeug sein.

Ansonsten haben Sie vernünftige Vorschläge von anderen Leuten - netstat insbesondere sollte helfen.

0

Verfahren B ist nicht mehr auf der anderen Seite des (vermutlich dgram) socket - vielleicht starb er, oder geschlossen, um die Dateikennung usw.

sendto(2) auf Linux wird ECONNREFUSED Rückkehr für eine SOCK_DGRAM oder SOCK_SEQPACKET Unix Domain Socket, wenn das Empfangsende tot ist. (SOCK_STREAM Unix-Sockets werden dies nicht tun - sie werden stattdessen ENOTCONN zurückgeben.)

Verwandte Themen