Linux

“service mysqld stop”超時(然後發現“mysqld dead but subsys locked”)

  • September 17, 2011

我通過 yum 在我的 64 位 CentOS 5 伺服器上安裝了 mysql 和伺服器。它啟動得很好,但是當我試圖停止它時它停止了,然後我必須“Ctrl-C”它。然後我執行“服務 mysqld 狀態”,它顯示:

mysqld dead but subsys locked

我執行 ps aux 並且找不到 mysql。通過“service mysqld start”再次啟動 mysqld 工作正常。試圖阻止它會產生同樣的問題。

然後我意識到它/var/lock/subsys/mysqld仍然存在。執行 mysqld 時,我檢查/var/run/mysqld/mysqld.pid了它與正在執行的服務的 pid 匹配。

我嘗試重新安裝 mysql 並刪除所有文件和配置,但無濟於事。

該怎麼辦?

編輯:

我在 /etc/init.d/mysqld 文件中添加了一些 echo 語句,特別是在 stop 函式中:

stop(){
       if [ ! -f "$mypidfile" ]; then
           # not running; per LSB standards this is "ok"
           action $"Stopping $prog: " /bin/true
           return 0
       fi  
       echo "beginning stop sequence"
       MYSQLPID=`cat "$mypidfile"`
       if [ -n "$MYSQLPID" ]; then
           /bin/kill "$MYSQLPID" >/dev/null 2>&1
           echo "killing pid $MYSQLPID"
           ret=$?
           if [ $ret -eq 0 ]; then
               echo "return code $ret after kill attempt"
               TIMEOUT="$STOPTIMEOUT"
               echo "timeout is set to $STOPTIMEOUT"
               while [ $TIMEOUT -gt 0 ]; do
                   /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
                   sleep 1
                   let TIMEOUT=${TIMEOUT}-1
                   echo "timeout is now $TIMEOUT"
               done
               if [ $TIMEOUT -eq 0 ]; then
                   echo "Timeout error occurred trying to stop MySQL Daemon."
                   ret=1
                   action $"Stopping $prog: " /bin/false
               else
                   echo "attempting to del lockfile: $lockfile"
                   rm -f $lockfile
                   rm -f "$socketfile"
                   action $"Stopping $prog: " /bin/true
               fi
           else
               action $"Stopping $prog: " /bin/false
           fi
       else
           # failed to read pidfile, probably insufficient permissions
           action $"Stopping $prog: " /bin/false
           ret=4
       fi
       return $ret
}

這是我嘗試停止服務時得到的結果:

[root@server]# service mysqld stop
beginning stop sequence
killing pid 9145
return code 0 after kill attempt
timeout is set to 60
timeout is now 59
timeout is now 58
timeout is now 57
timeout is now 56
timeout is now 55
timeout is now 54
timeout is now 53
timeout is now 52
timeout is now 51
timeout is now 50
timeout is now 49

從查看程式碼來看,在我看來,它永遠不會脫離那個 while 循環,也無法刪除鎖定文件。我解釋錯了嗎?我在另一台伺服器上檢查了相同的文件,它使用相同的程式碼。我傻眼了。

編輯:在while循環部分

/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break

由於某種原因,它無法辨識返回碼。當呼叫 service mysqld stop 時,該程序已被終止,但不確定為什麼它不允許循環中斷。

編輯/bin/kill:進一步的測試顯示呼叫和呼叫之間有一些奇怪的行為kill,它們顯然返回不同的程式碼,為什麼??????:

[root@server]# /bin/kill 25200
kill 25200: No such process
[user@server]# echo ${?}
0
[root@server]# kill 25200
-bash: kill: (25200) - No such process
[root@server]# echo ${?}
1

編輯:我以非 root 使用者身份登錄並嘗試執行“kill”和“/bin/kill”,結果令人驚訝:

[notroot@server ~]$ kill -0 23232
-bash: kill: (23232) - No such process
[notroot@server ~]$ echo $?
1
[notroot@server ~]$ /bin/kill -0 23232
kill 23232: No such process
(No info could be read for "-p": geteuid()=501 but you should be root.)
[notroot@server ~]$ echo $?
0

以非 root 使用者身份執行 kill 和 bin/kill 時,“無法讀取資訊”錯誤不會出現在我的其他伺服器中。

編輯:添加了 quanta 描述的日誌記錄,還檢查了 mysql 日誌:

啟動和停止後,mysql日誌顯示:

110918 00:11:28 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
110918  0:11:28 [Note] Plugin 'FEDERATED' is disabled.
110918  0:11:28  InnoDB: Initializing buffer pool, size = 16.0M
110918  0:11:28  InnoDB: Completed initialization of buffer pool
110918  0:11:29  InnoDB: Started; log sequence number 0 44233
110918  0:11:29 [Warning] 'user' entry 'root@server' ignored in --skip-name-resolve mode.
110918  0:11:29 [Warning] 'user' entry '@server' ignored in --skip-name-resolve mode.
110918  0:11:29 [Note] Event Scheduler: Loaded 0 events
110918  0:11:29 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.1.58-ius'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Distributed by The IUS Community Project
110918  0:11:34 [Note] /usr/libexec/mysqld: Normal shutdown

110918  0:11:34 [Note] Event Scheduler: Purging the queue. 0 events
110918  0:11:34  InnoDB: Starting shutdown...
110918  0:11:39  InnoDB: Shutdown completed; log sequence number 0 44233
110918  0:11:39 [Note] /usr/libexec/mysqld: Shutdown complete

110918 00:11:39 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

然後在 tmp/mysql.log 中:

kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process

我中途停止了停止過程,所以我不必等待超時。看起來程序被殺死了。我認為,問題仍然在於來自"kill"和的不同返回碼"/bin/kill"

第一件事:一個非常好的,系統的和徹底的調試,幹得好。

在我的 RHEL 5.6 機器上,如果我試圖殺死一個不存在的 pid,我總是得到一個返回碼 1。我嘗試以 root 和非特權使用者的身份使用完整路徑和僅使用命令名稱的使用者。我也只得到 terse kill XXX: No such process,沒有詳細的錯誤消息。

rpm -Vv util-linux執行並查看是否有人沒有/bin/kill用新的和改進的版本替換可能是個好主意。即使 rpm 驗證表明該文件是原始文件,我也會嘗試重命名/bin/kill並從工作機器複製二進製文件。如果文件替換有幫助,並且您沒有發現合法的更改來源,那麼無論 rpm 驗證的輸出如何,​​我都會假設機器已被入侵。

引用自:https://serverfault.com/questions/312478