“service mysqld stop”超時(然後發現“mysqld dead but subsys locked”)
我通過 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 驗證的輸出如何,我都會假設機器已被入侵。