生产机器apache无故停掉,再次启动apache,报错,Apache不能启动,提示:
“ [emerg] (28)No space left on device: Couldn't create accept lock (/usr/local/apache2/logs/accept.lock.10396)”
手动启动内部服务器的apache时,没启动成功,看了下/var/log/httpd/error_log,有如下错误:
“[Mon Aug 06 09:32:20 2012] [emerg] (28)No space left on device: Couldn’t create accept lock (/etc/httpd/logs/accept.lock.6399) (5)”
开始根据提示去找磁盘空间不足,发现磁盘空间充足,所以这里的“no space”不是指磁盘空间。
后来发现原因是一些IPC的资源占用问题,先用”ipcs”命令查一下当前用于已经使用了的信号量集合(semaphore sets),再用“sysctl”命令查询一下每个用户最多可使用的信号量,发现基本上占用完了,不能给新的apache进程使用了(尽管没有完全占满,但是httpd.conf文件中写了已开始启动8个server进程的,确实不够分配)。
[root@vmm-web ~]# ipcs -s | grep apache
0x00000000 10649601 apache 600 1
0x00000000 10616834 apache 600 1
........
#有很多,大约有120行;当然如果不是apache用户账号启动的apache,需要根据实际情况灵活变通;
[root@vmm-web ~]# sysctl kernel.sem #查看系统信号量
kernel.sem = 250 32000 32 128
已经确定apache这个账号下的semaphores是不用了(除了给我的HTTPD服务器),所以只需要用“ipcrm -s”命令kill掉这些semaphore array即可。
解决步骤:
1)切换到root账号,先用下面的这个命令检查一下哪个用户的信号量比较多:
#ipcs -a 或者#ipcs -s
2)然后关掉那个用户的apache,用下面这个命令删除信号量(注意修改用户名):
#ipcs -s | grep username| awk '{ print $2 }' | xargs -n 1 ipcrm -s
3)最后重启Apache,问题解决。
备注用法:
ipcrm [options]
ipcrm [...]
选项:
-m, --shmem-id 按 id 号移除共享内存段
-M, --shmem-key 按键值移除共享内存段
-q, --queue-id 按 id 号移除消息队列
-Q, --queue-key 按键值移除消息队列
-s, --semaphore-id 按 id 号移除信号量
-S, --semaphore-key 按键值移除信号量
-a, --all[=] 全部移除
-v, --verbose 解释正在进行的操作