“service mysqld stop” expira (depois descobre que “mysqld dead mas subsys locked”)

5

Eu instalei o mysql e o servidor via yum no meu servidor 64 bits do CentOS 5. Ele começa bem, mas quando eu tento pará-lo, ele pára e então eu tenho que "Ctrl-C". Então eu corro um "status do serviço mysqld" e ele mostra:

mysqld dead but subsys locked

Eu corro ps aux e o mysql não está em lugar nenhum. Iniciando o mysqld novamente via "service mysqld start" funciona bem. A tentativa de pará-lo cria o mesmo problema.

Eu percebi que /var/lock/subsys/mysqld ainda existe. Ao executar o mysqld, eu verifiquei o /var/run/mysqld/mysqld.pid e ele correspondeu com o pid do serviço em execução.

Eu tentei reinstalar o mysql e excluir todos os arquivos e configurações, mas sem sucesso.

O que fazer?

EDITAR:

Eu adicionei algumas instruções echo no arquivo /etc/init.d/mysqld, particularmente na função 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
}

Este é o resultado que recebo quando tento parar o serviço:

[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

Ao olhar para o código, parece-me que ele nunca sairá desse loop while e não será capaz de excluir o arquivo de bloqueio. Estou interpretando isso errado? Eu verifiquei o mesmo arquivo no meu outro servidor e ele usa o mesmo código. Estou perplexo.

EDITAR : Na parte do loop while

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

Por algum motivo, não está reconhecendo o código de retorno. Quando o serviço mysqld stop é chamado, o processo já foi eliminado, mas não tem certeza porque não está permitindo que o loop seja interrompido.

EDITAR : Testes adicionais mostram algum comportamento estranho entre chamar /bin/kill e apenas chamar kill , eles aparentemente retornam códigos diferentes, por que ??????:

[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

EDIT : Eu fiz logon como usuário não-root e tentei executar "kill" e "/ bin / kill" com resultados surpreendentes:

[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

O erro "Nenhuma informação pôde ser lida" não aparece em meus outros servidores ao executar kill e bin / kill como um usuário não root.

EDIT : Adicionado o registro descrito por quanta e também verificado o log do mysql:

Depois de iniciar e parar, o log do mysql mostra isso:

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

Em seguida, no 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

Parei o processo de parada no meio do caminho para não ter que esperar pelo tempo limite. Parece que o processo foi morto. O problema, eu acho, ainda está com os diferentes códigos de retorno de "kill" e "/bin/kill"

    
por lamp_scaler 17.09.2011 / 12:52

1 resposta

2

Primeiras coisas primeiro: uma depuração bem feita, sistemática e completa, bom trabalho.

Na minha caixa RHEL 5.6 eu sempre recebo um código de retorno de 1 se eu tentar matar um pid inexistente. Eu tentei como root e um usuário não privilegiado, ambos com caminho completo e um com apenas o nome do comando. Eu também recebo apenas kill XXX: No such process , sem mensagens de erro elaboradas.

Pode ser uma boa ideia executar rpm -Vv util-linux e ver se alguém não substituiu /bin/kill por uma versão nova e melhorada. Mesmo se a verificação de rpm disser que o arquivo é primitivo, eu tentaria renomear /bin/kill e copiar um binário de uma máquina em funcionamento. Se a substituição do arquivo ajudar e você não descobrir uma fonte legítima da alteração, então, independentemente da saída da verificação do rpm, presumo que a máquina foi comprometida.

    
por 17.09.2011 / 20:53