При перезапуске службы httpd в RHEL возвращается сообщение «Остановка httpd: [FAILED]» - как это исправить?

Это мое первое указание на проблему:

$ sudo /sbin/service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd: no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]     


Я знаю, что httpd работает

$ ps -ef | grep httpd | grep -v grep
apache    9619 20181  0 07:08 ?        00:00:03 /usr/sbin/httpd
apache   10092 20181  0 Jan24 ?        00:00:07 /usr/sbin/httpd
apache   13086 20181  0 06:09 ?        00:00:00 /usr/sbin/httpd
apache   13717 20181  0 Jan25 ?        00:00:01 /usr/sbin/httpd
apache   14730 20181  0 07:13 ?        00:00:01 /usr/sbin/httpd
apache   16359 20181  0 09:54 ?        00:00:00 /usr/sbin/httpd
root     20181     1  0  2011 ?        00:00:01 /usr/sbin/httpd
apache   21450 20181  0 09:55 ?        00:00:00 /usr/sbin/httpd


и использует порты 80 и 443

$ sudo netstat -lnp | grep :80
tcp        0      0 :::80                       :::*                        LISTEN      9619/httpd
$ sudo netstat -lnp | grep :443
tcp        0      0 :::443                      :::*                        LISTEN      9619/httpd 


, поэтому я предполагаю, что получаю сообщение «нет доступных сокетов для прослушивания», потому что httpd не может остановиться, чтобы освободить порты 80 и 443.


Я использую RHEL версии 5.7:

$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)


Я вижу кучу процессы, запущенные для httpd:

$ pgrep httpd
9619
10092
13086
13717
14730
16359
20181
21450


Что может помешать остановке httpd? Если я убью процессы для httpd, смогу ли я запустить httpd без проблем?

5
задан 26 January 2012 в 23:13
3 ответа

Функция остановки в /etc/init.d/httpd использует pid-файл:

killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd

Возможно, pid-файл /var/run/httpd.pid находится вне дата или отсутствует (могли ли вы запустить httpd в прошлом без использования сценария /etc/init.d или службы ?). Вы можете проверить этот файл (и его содержимое) с помощью ps -ef | grep http .

Да, просто sudo kill 20181 . Затем запустите службу, как обычно. Затем попробуйте перезапустить после этого.

Если это произойдет снова, вам, вероятно, следует выяснить, почему файл pid не работает с таблицей процессов.

4
ответ дан 3 December 2019 в 01:33

Вы должны быть может убить процессы HTTP - текущие соединения, конечно, будут прерваны, и если кто-то в данный момент отправляет вам данные (например, отправляет форму), они могут быть потеряны. Но в целом да, это нормально. То же самое произойдет и с перезапуском httpd службы . Возможно, вам придется очистить файл блокировки в / var / lock / subsys / httpd (удалить этот файл).

Затем я бы запустил service httpd configtest , чтобы убедиться, что ваша конфигурация apache хотя бы загружается. Затем попробуйте запустить его с помощью service httpd start

Вы правы в том, что ошибки, связанные с используемыми портами, связаны с тем, что httpd все еще работает, и поэтому вы используете эти порты. Точно так же и ошибка журнала.

И еще одно - нет необходимости запускать sudo , чтобы использовать ps или netstat . Возьмите за правило использовать sudo только для тех вещей, для которых это необходимо. Это избавит вас от неприятностей позже, когда вы избежите выполнения деструктивной команды с привилегиями root, когда вы этого не хотите.

s нет необходимости запускать sudo , чтобы использовать ps или netstat . Возьмите за правило использовать sudo только для тех вещей, для которых это необходимо. Это избавит вас от неприятностей позже, когда вы избежите выполнения деструктивной команды с привилегиями root, когда вы этого не хотите.

s нет необходимости запускать sudo , чтобы использовать ps или netstat . Возьмите за правило использовать sudo только для тех вещей, для которых это необходимо. Это избавит вас от неприятностей позже, когда вы избежите выполнения деструктивной команды с привилегиями root, когда вы этого не хотите.

1
ответ дан 3 December 2019 в 01:33

Выполните аналогичные попытки на centos6 с ispconfig3 и Apache. Сообщение cjc помогло мне найти ответ на мой. (спасибо!) Оказывается, путь PID в /etc/httpd/conf/httpd.conf по какой-то причине отличается от пути в /etc/init.d/httpd. Как только я сделал их такими же (я решил отредактировать httpd.conf, оставив только сценарий init.d), затем убил httpd, используя PID, указанный в ps -ef, затем снова запустил httpd с помощью /etc/init.d/httpd start & voila, он работает как должно. service httpd status / stop / restart / start теперь все работает, как ожидалось.

Я подозреваю, что файл http.conf, возможно, был заменен из резервной копии centos5 или, возможно, он был отредактирован в какой-то момент, если по умолчанию не было неправильных, хотя это кажется маловероятным .

/etc/httpd/conf/httpd.conf

Before:
PidFile run/httpd.pid

After:
PidFile run/httpd/httpd.pid

/etc/init.d/httpd дал намек на то, что это должно было быть:

# pidfile: /var/run/httpd/httpd.pid

В моем статусе было указано «Остановлено», хотя в ps явно было показано, что httpd работает. stop выдал ошибку, start выдал порты, которые уже используются. Оглядываясь назад, сейчас это имеет смысл, но я хотел опубликовать это, если кто-то еще столкнется с тем же. stop также давал httpd мертв, но иногда subys блокировался.

Пример ошибки, которую я получал:

Stopping httpd:                                            [FAILED]
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
1
ответ дан 3 December 2019 в 01:33

Теги

Похожие вопросы