Дано: процесс связывается с портом в Linux, и этот процесс затем завершается с помощью сигналов TERM или KILL. Есть ли в любом случае, что порт все еще может быть связан, или ядро очистится и гарантирует, что порт будет свободен?
2 ответа
Если исходный процесс порождает дочерние процессы, дочерние процессы могут оставить сокет открытым после выхода из родительского процесса. Если родительский процесс является единственным процессом с открытым сокетом, он должен очиститься после завершения. Существующий процесс закроет все дескрипторы открытых файлов, включая все его сокеты.
Как только закрытие инициировано, сокет все еще может находиться в состоянии TIME_WAIT. TCP пытается гарантировать доставку всех передаваемых данных. Когда сокет закрыт, он входит в TIME_WAIT для выполнения этой гарантии. Существует несколько переменных, которым может потребоваться некоторое время, если они являются сокетами TCP, например, для завершения рукопожатия или если сокеты были настроены с параметром SO_LINGER.
Вот ссылка, которая объясняет TIME_WAIT из FAQ по сокетам Unix:http://www.developerweb.net/forum/showthread.php?t=2941
Я знаю, что иногда при использовании apache, если я запускаю apachectl stop, процесс фактически не завершается полностью, и мне нужно запустить http-killall -9, чтобы получить чистый порт для привязки.