Не запускается Apache. В логах ошибка: (28)No space left on device...

Описание ситуации

После падения apache он не запускается. В /var/log/httpd/error.log сообщения вида:

[Tue Apr 21 15:50:00 2009] [emerg] (28)No space left on device: Couldn't create accept lock (/var/lock/apache2/accept.lock.19320) (5)

или вида:

[Tue Apr 21 15:50:00 2009] [crit] (28)No space left on device: mod_rewrite: could not create rewrite_log_lock

При этом в списке процессов apache нет, а команда df показывает, что места на диске предостаточно.

Возможное решение

Довольно редко встречающаяся ошибка, в основном связана с неосвобождением системой семафоров, которые выделяет для себя apache. Выполните команду:

# ipcs -s
------ Массивы семафоров --------
ключ   semid      владелец права nsems     
0x00000000 30572544   apache    600        1         
0x00000000 30212097   apache    600        1         
0x00000000 30605314   apache    600        1         
0x00000000 30638083   apache    600        1         
0x00000000 30670852   apache    600        1         
0x00000000 30703621   apache    600        1     

Если вы видите что-то подобное, то это оно и есть! После того как процесс apache завершился, в системной таблице семафоров остались неосвобождённые семафоры. При попытке стартовать, apache снова хочет выделить семфоры, но операционная система говорит, что свободного место в таблице нет, отсюда и сообщение 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 запускается от имени другого пользователя, учитывайте это!