httpd dead but subsys locked

urgel_babay發表於2016-03-01
 今天公司的網站被DDOS 攻擊了,然後不斷的重啟apache,結果因為重啟次數過多導致http程式起不來。

原文地址:
<a target="_blank" href="http://blog.sina.com.cn/s/blog_45e9485a0100lqrz.html" title="httpd dead but subsys locked!" style="text-decoration:none;color:#4C6B73;">httpd dead but subsys locked!
作者:Xiaoliruizi
網站伺服器突然不能上,登上伺服器發現httpd服務不能shutdown,報如下錯誤:
httpd dead but subsys locked ;
把/var/lock/subsys/下的httpd刪除重啟httpd服務也不行,檢視/var/log/httpd/error_log發現錯誤如下
:No space left on device:Couldn't create accept lock ; 解決辦法如下:

1.首先確定你的磁碟空間是否真的不足或者已經達到配額;

 

2.如果磁碟空間還很充足或配額也夠,那麼apache能產生’accept lock‘的另一個原因是 semaphore, 
semaphore是一個內部用於與其子程式進行交流的工具,"
 No space left on device:
Couldn't create accept lock
 
"的意思是說apache不能再建立新的semaphore程式。
用如下命令檢視有多少
 semaphore在執行。

 

#ipcs -s 你將會看到

  ------ Semaphore Arrays --------
key         semid    owner perms nsems
0x00000000 68681743 apache 600     1
0x00000000 68714515 apache 600     1
0x00000000 68747291 apache 600     1

你可執行如下命令來安全的殺死每個 Semaphore

#ipcrm -s <semid>

<semid>是上面ipcs -s輸出的第二列值。

想要一次性將所有的Semaphore全部殺死,請執行如下命令:

for semid in `ipcs -s |awk '{print $2}'`; do ip crm -s $semid; done

如果不能再建立更多的Semaphores:

有些時候你可能想改變系統允許建立 semaphores的數量。這就需要改變核心引數。

如果你在虛擬機器上執行而不能改變核心引數,請聯絡你的主機提供商來改變這個引數。

執行以下命令來檢視當前引數:

#ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 1024
max semaphores per array = 250
max semaphores system wide = 256000
max ops per semop call = 32
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 1024
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

修改 /etc/sysctl.conf檔案,增加如下兩行:

kernel.msgmni = 1024
kernel.sem = 250 256000 32 1024

執行命令# sysctl -p

使剛改的引數生效。

(kernel.msgmni 該檔案指定訊息佇列標識的最大數目,即系統 範圍內最大多少個訊息佇列。 預設設定 : 16)


另外延伸到/var/lock/subsys作用

關於/var/lock/subsys目錄
總的來說,系統關閉的過程(發出關閉訊號,呼叫服務自身的程式)中會檢查/var/lock/subsys
下的檔案,逐一關閉每個服務,如果某一執行的服務在/var/lock/subsys下沒有相應的選項。在
系統關閉的時候,會像殺死普通程式一樣殺死這個服務。
透過察看/etc/rc.d/init.d下的指令碼,可以發現每個服務自己操縱時都會去檢視
/var/lock/subsys下相應的服務。
例如:
[root@rrd init.d]# pwd
/etc/rc.d/init.d
[root@rrd init.d]# cat syslog
#!/bin/sh
#
# syslog        Starts syslogd/klogd.
#
#
# chkconfig: 2345 30 99
# description: Syslog is the facility by which many daemons use to log 
# messages to various system log files.  It is a good idea to always 
# run syslog.
# securlevel: 90
# processname: syslogd klogd
# Source function library.
. /etc/rc.d/init.d/functions
[ -f /sbin/syslogd ] || exit 0
[ -f /sbin/klogd ] || exit 0
if [ -f /etc/sysconfig/syslog ]
then
  . /etc/sysconfig/syslog
else
  SYSLOGD_OPTIONS="-m 0"
  KLOGD_OPTIONS=""
fi
RETVAL=0
# See how we were called.
case "$1" in
  start)
        echo -n "Starting system logger: "
        # we don't want the MARK ticks
        daemon syslogd $SYSLOGD_OPTIONS
        RETVAL=$?
        echo
        echo -n "Starting kernel logger: "
        daemon klogd $KLOGD_OPTIONS
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog
        ;;
  stop)
        echo -n "Shutting down kernel logger: "
        killproc klogd
        echo
        echo -n "Shutting down system logger: "
        killproc syslogd
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/syslog
        ;;
  status)
        status syslogd
        status klogd
        RETVAL=$?
        ;;
  restart|reload)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
  *)
        echo "Usage: syslog {start|stop|status|restart}"
        exit 1
esac
exit $RETVAL
# cd /var/lock/subsys/
# ll syslog 
-rw-r--r--  1 root root 0 Jan 27 19:20 syslog

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30936525/viewspace-2018418/,如需轉載,請註明出處,否則將追究法律責任。

相關文章