Sytuacja wygląda następująco:
Proces usługi / nadrzędny jest podłączony do „portu publicznego” (proces nadrzędny to usługa). Ten „port publiczny” to 11000. Gdy nowe żądania docierają do procesu nadrzędnego z portu 11000, serwer wysyła te żądania do procesu potomnego za pomocą „prywatnego” portu (gniazda). Wiesz, typowy sposób implementacji serwerów.
Proces nadrzędny zostaje zabity, ale gniazdo nie jest zamknięte (nie znam jeszcze przyczyny).
Proces osierocony czeka, że gniazdo jest zamknięte, a pkill nie działa (jest w nieprzerwanym śnie).
Nie mogę ponownie uruchomić serwera, ponieważ serwer twierdzi, że adres (0.0.0.0:11000) jest już w użyciu.
Mam więc dwie opcje, aby zamknąć „gniazdo wewnętrzne”, aby zakończyć proces osierocony, lub „zwolnić” w jakiś sposób adres / port 0.0.0.0:11000, aby ponownie uruchomić serwer i pozostawić proces osierocony w stanie oczekiwania. Chodzi o to, aby unikać ponownego uruchamiania serwera za każdym razem, gdy zawiedzie, podczas gdy ja badam problem.
Przydatne informacje o sytuacji (pid procesu potomnego to 1993):
$ sudo lsof -np 1993
[...]
proc 1993 root 16u IPv4 14997 0t0 TCP 127.0.0.1:42982->127.0.0.1:37528 (CLOSE_WAIT)
Tak więc port, którego nie chcę zamknąć, to 37528. Deskryptor pliku odpowiedniego gniazda to 16u (lub tak mi się wydaje).
$ sudo strace -p 1993
Process 1993 attached
futex(0x2fff414, FUTEX_WAIT_PRIVATE, 1, NULL
$ netstat -np
[...]
tcp 0 0 127.0.0.1:42982 127.0.0.1:37528 CLOSE_WAIT -
Jeśli spróbuję połączyć się z procesem osieroconym za pomocą gdb
:
$ gdb -p 1993
Attaching to process 1993
{process_path} (deleted): No such file or directory.
Ponieważ proces macierzysty został zabity, tak myślę. Chodzi o to, że nie mogę połączyć się z procesem osieroconym, aby zadzwonić close(16u)
.
Jak mogę „rozwiązać” sytuację?
UWAGI : Próbowałem już zrestartować networking
usługę, ale nie działa. Jest to Ubuntu Server 14.04 (VirtualBox) i łączę się z moją maszyną za pomocą ssh. Nie ma menedżera sieci.
Starałem się stosować ifdown
, ifup
aby każdy interfejs (eth0, eth1, lo y virbr), ale nie zamyka gniazdo.