суббота, 19 июля 2014 г.

Apache2 завершается сразу после старта

Добрый день.

Возникла проблема: Apache2 падает сразу после запуска.
То есть инициализация проходит:
# /etc/init.d/httpd start
Запускается httpd:                                         [  OK  ]

Но если сразу глянуть состояние сервиса:
# /etc/init.d/httpd status
httpd не работает, но pid-файл существует

То видим, что Apache2 не работает:
# ps aux | grep http
root     23242  0.0  0.0 103256   904 pts/0    S+   04:19   0:00 grep http

В error логе Apache2 увидел такое:
# tail /var/log/httpd/error_log
[Sun Jul 20 04:18:41 2014] [warn] pid file /etc/httpd/run/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Sun Jul 20 04:18:41 2014] [emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.23121) (5)
[Sun Jul 20 04:20:34 2014] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Jul 20 04:20:34 2014] [notice] Digest: generating secret for digest authentication ...
[Sun Jul 20 04:20:34 2014] [notice] Digest: done
[Sun Jul 20 04:20:34 2014] [emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.23306) (5)
[Sun Jul 20 04:21:51 2014] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Jul 20 04:21:51 2014] [notice] Digest: generating secret for digest authentication ...
[Sun Jul 20 04:21:51 2014] [notice] Digest: done
[Sun Jul 20 04:21:51 2014] [emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.23481) (5)


Увидев: [Sun Jul 20 04:18:41 2014] [warn] pid file /etc/httpd/run/httpd.pid overwritten -- Unclean shutdown of previous Apache run? удалял файл с pid'ом, но это не помогало.

Потом посмотрел на эту ошибку: [Sun Jul 20 04:20:34 2014] [emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.23306) (5) немного погуглив понял, что ошибка связана с переполнением таблицы семафоров.

Что такое семафоры можно почитать тут и тут.

Посмотрим пределы семафоров:
# ipcs -sl
------ Пределы семафоров --------
максимальное количество массивов = 128
максимум семафоров на массив = 250
максимум семафоров на всю систему = 32000
максимум операций на вызов семафора = 32
максимальное значение семафора = 32767


Видим, что максимальное количество массивов = 128.

Теперь посмотрим, сколько же используется в данный момент:
# ipcs -su
------ Состояние семафора --------
использовано массивов = 127
выделено семафоров = 127

Видим, что используется 127 массивов, то есть у нас остается 1 свободный массив.

А вот сами все эти семафоры (Обычно в третьей колонке пишется имя пользователя от которого работает Apache2, но в данном случае было записано непонятное значение 4294967295, но это не суть):
# ipcs -s
------ Массивы семафоров --------
ключ   semid      владелец права nsems     
0x00000000 0          root       600        1         
0x00000000 32769      root       600        1         
0x00000000 1409027    4294967295 600        1         
0x00000000 131076     4294967295 600        1         
0x00000000 163845     4294967295 600        1         
...
0x00000000 4817023    4294967295 600        1         

Нужно очистить данные массивы семафоров, для этого создадим файл:
# cat sems.sh 
#!/bin/bash
sems=$(ipcs -s | grep 4294967295 | awk --source '/0x0*.*[0-9]* .*/ {print $2}')
for sem in $sems
do
  ipcrm sem $sem
done

В команде grep нужно указать значение третьей колонки (чистить семафоры root'a лучше не стоит).
Сделаем скрипт выполняемым:
# chmod +x sems.sh 

И запустим его:
# ./sems.sh
ресурсы(ы) удален(ы)
...
ресурсы(ы) удален(ы)
ресурсы(ы) удален(ы)
ресурсы(ы) удален(ы)
ресурсы(ы) удален(ы)
ресурсы(ы) удален(ы)


Убедимся, что семафоры очищены:
# ipcs -s
------ Массивы семафоров --------
ключ   semid      владелец права nsems     
0x00000000 0          root       600        1         
0x00000000 32769      root       600        1  

# ipcs -su
------ Состояние семафора --------
использовано массивов = 2
выделено семафоров = 2

И запустим Apache2:
# /etc/init.d/httpd start
Запускается httpd:                                         [  OK  ]

# /etc/init.d/httpd status
httpd (pid  24183) выполняется...

# ps aux | grep http
root     24183  0.4  0.2 275392 10516 ?        Ss   04:26   0:00 /usr/sbin/httpd
apache   24185  0.7  0.2 375656 13136 ?        S    04:26   0:00 /usr/sbin/httpd
apache   24186  0.7  0.2 375840 13200 ?        S    04:26   0:00 /usr/sbin/httpd
apache   24187  0.7  0.2 373276 10768 ?        S    04:26   0:00 /usr/sbin/httpd
apache   24188  0.7  0.2 373268 10752 ?        S    04:26   0:00 /usr/sbin/httpd
apache   24189  0.7  0.2 373276 10768 ?        S    04:26   0:00 /usr/sbin/httpd
apache   24190  0.7  0.2 373276 10772 ?        S    04:26   0:00 /usr/sbin/httpd
apache   24191  0.0  0.1 275392  5952 ?        S    04:26   0:00 /usr/sbin/httpd
apache   24192  0.0  0.1 275392  5952 ?        S    04:26   0:00 /usr/sbin/httpd
root     24213  0.0  0.0 103256   904 pts/0    S+   04:26   0:00 grep http

Посмотрим состояние массивов семафоров после запуска Apache2:
# ipcs -s
------ Массивы семафоров --------
ключ   semid      владелец права nsems     
0x00000000 0          root       600        1         
0x00000000 32769      root       600        1         
0x00000000 5079042    apache     600        1         
0x00000000 5111811    apache     600        1         

# ipcs -su
------ Состояние семафора --------
использовано массивов = 4
выделено семафоров = 4

Как видим, Apache2 создал 2 массива семафоров для своей работы. Теперь становится ясно, почему не запускался Apache2, а не запускался он потому, что было доступен только 1 массив семафоров, а ему было необходимо 2.

Комментариев нет:

Отправить комментарий