Не стартует apache

Thank you for reading this post, don't forget to subscribe!

не запу­щен сервер:

netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22278/nginx
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 535/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1400/sendmail
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1347/mysqld
tcp 0 0 :::22

смот­рим статус:
/etc/init.d/httpd status
httpd dead but pid file exists

мож­но попро­бо­вать уда­лить PID файл и пере­за­пу­стить apache
rm -f /var/run/httpd/httpd.pid
в моём слу­чае это не помогло,

смот­рим лог apache

tail -1 /var/log/httpd/error_log
[Sun Apr 08 13:17:02 2018] [emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.17084) (5)

Посмот­рим пре­де­лы семафоров:

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

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

 

Теперь посмот­рим, сколь­ко же исполь­зу­ет­ся в дан­ный момент:

ipcs -su

------ Semaphore Status --------
used arrays = 128
allocated semaphores = 128

А вот все эти сема­фо­ры (Обыч­но в тре­тьей колон­ке пишет­ся имя поль­зо­ва­те­ля от кото­ро­го рабо­та­ет 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

Для реше­ния дан­ной про­бле­мы, нуж­но очи­стить дан­ные мас­си­вы семафоров:

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 луч­ше не стоит).

Либо одно­строч­ник:
for i in `ipcs -s | awk '/httpd/ {print $2}'`; do (ipcrm -s $i); done

ещё вари­ант:
ipcs -s | grep nobody | perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

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