Ошибка перезапуска Apache

271
Paddington

Мой сервер имел высокую нагрузку, и я остановил Apache2, пока нагрузка не уменьшилась с помощью killall -9 apache2. При запуске Apache2 я получил ошибку:

* # /etc/init.d/apache2 restart * Перезапуск веб-сервера apache2 httpd (pid 4457?) не запущен (98) Адрес уже используется: make_sock: невозможно привязать к адресу 0.0.0.0:80 нет доступных сокетов прослушивания, закрытие вниз Невозможно открыть логи *

Я тогда лсоф | grep "* .www" и убил процесс, используя порт 80.

Мой вопрос: как процесс может использовать порт 80 даже после выполнения команды kill all?

0
Использование 'kill -9` вместо `service httpd stop` (или эквивалентного) похоже на то, чтобы убрать ваш дом с орбиты, чтобы выключить настольную лампу. RedGrittyBrick 11 лет назад 1
Под высокой нагрузкой требуется очень много времени, чтобы выполнить постепенное завершение процесса Apache. То есть вы говорите, что использование команды kill само по себе является проблемой? Paddington 11 лет назад 0
Да, использование `killall -9 ...` может создать проблемы. kill -9 (SIGKILL) - самый экстремальный способ остановки процесса, и он должен быть последним средством, есть другие сигналы (SIGINT, SIGQUIT и т. д.), которые вы можете отправить, которые дают процессу возможность очистить и освободить любые ресурсы. он заблокирован или выделен. Во-вторых, вам, вероятно, нужно остановить только один процесс, который прослушивает порт 80, чтобы предотвратить принятие дальнейших запросов, вам не нужно уничтожать все другие рабочие процессы. RedGrittyBrick 11 лет назад 0

1 ответ на вопрос

0
RedGrittyBrick

http://httpd.apache.org/docs/2.2/stopping.html

Чтобы остановить или перезапустить Apache, вы должны отправить сигнал запущенным процессам httpd. Есть два способа отправки сигналов. Во-первых, вы можете использовать команду unix kill для прямой отправки сигналов процессам. Вы заметите много исполняемых файлов httpd, работающих в вашей системе, но вы не должны отправлять сигналы ни одному из них, кроме родительского, чей pid находится в PidFile. То есть вам никогда не нужно отправлять сигналы любому процессу, кроме родительского. Существует четыре сигнала, которые вы можете отправить родителю: TERM, USR1, HUP и WINCH, которые будут описаны ниже.

Чтобы отправить сигнал родителю, вы должны выполнить команду, такую ​​как:

 kill -TERM `cat /usr/local/apache2/logs/httpd.pid` 

Мой акцент.