В один прекрасный момент на рабочем сервере вырубился Apache и больше не хотел запускаться. Т.к. апач стоит в связке с nginx - первый репортовал ошибку, что не может отдать запрос дальше (т.е. апачу).После старта руками сервер Apache выдавал сообщение "failed".
В логах при этом шли записи /var/log/httpd/error.log
:
[emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock)
Как закончилось место? Смотрим df - и видим, что у нас свободно 720GB. Копаем дальше и выясняем, что эта ошибка довольно редкая, в основном связана с неосвобождением системой семафоров, которые выделяет для себя apache. Выполните команду:
# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 root 600 1
0x00000000 65537 root 600 1
0x0000014c 98306 root 600 1
0x00000000 163843 apache 600 1
0x00000000 196612 apache 600 1
0x00000000 229381 apache 600 1
0x00000000 262150 apache 600 1
0x00000000 294919 apache 600 1
При попытке стартовать веб-сервис, система хочет выделить семфоры, но операционная система сообщая о том, что свободного место в таблице нет, отсюда и сообщение No space left on device.
Если ситуация повторяется - можно чистить семафоры автоматически скриптом запихнув его в крон.
#!/bin/bash
sems=$(ipcs -s | grep apache | awk --source '/0x0*.*[0-9]* .*/ {print $2}')
for sem in $sems
do
ipcrm sem $sem
done
Измените имя пользователя apache на свое, если у вас Apache запускается от другого имени пользователя.