Como obter o pid de um processo e invocar kill -9 nele no shell script? [duplicado]

7

Eu tenho um servidor de aplicativos que começamos executando este comando abaixo e assim que executarmos o commnad abaixo, ele iniciará o meu servidor de aplicativos

/opt/data/bin/test_start_stop.sh start

E para parar meu servidor de aplicativos, fazemos assim -

/opt/data/bin/test_start_stop.sh stop

Então, assim que meu servidor de aplicativos estiver em execução e se eu fizer ps aux , é isso que recebo -

user@machineA:/home/user$ ps aux | grep gld_http
user 20426  0.0  0.0   8114   912 pts/4    S+   13:33   0:00 grep gld_http
user 40509  0.1  0.9 3878120 1263552 ?     Sl   Sep22   1:53 /opt/data/bin/gld_http

Agora estou tentando fazer um script de shell no qual preciso parar meu servidor de aplicativos e, em seguida, verificarei se meu processo está em execução depois de parar o servidor ou não, se meu processo ainda está em execução, então preciso fazer matar -9 do meu aplicativo pid. E eu não sei como obter o pid do meu processo no shell script e então mato-lo.

Abaixo está o meu script de shell que eu tenho a partir de agora que irá desligar meu servidor de aplicativos e verificar se o meu processo ainda está em execução ou não e se por acaso ele ainda estiver rodando, então eu preciso pegar o pid de meu processo e matar -9 naquele pid.

#!/bin/bash

/opt/data/bin/test_start_stop.sh stop

if ps aux | grep -v "grep" | grep "gld_http"
then
    echo "Server is still running"
    # now get the pid of my gld_http process and invoke kill -9 on it
else
   echo "Server is stopped"
fi

Como posso obter o pid do meu processo e matar -9 nele no script de shell acima?

ATUALIZAÇÃO: -

Então meu script final ficará assim -

#!/bin/bash

/opt/data/bin/test_start_stop.sh stop

if ps aux | grep -v "grep" | grep "gld_http"
then
    echo "Server is still running"

    # Getting the PID of the process
    PID='pgrep gld_http'

    # Number of seconds to wait before using "kill -9"
    WAIT_SECONDS=10

    # Counter to keep count of how many seconds have passed
    count=0

    while kill $PID > /dev/null
    do
        # Wait for one second
        sleep 1
        # Increment the second counter
        ((count++))

        # Has the process been killed? If so, exit the loop.
        if ! ps -p $PID > /dev/null ; then
            break
        fi

        # Have we exceeded $WAIT_SECONDS? If so, kill the process with "kill -9"
        # and exit the loop
        if [ $count -gt $WAIT_SECONDS ]; then
            kill -9 $PID
            break
        fi
    done
    echo "Process has been killed after $count seconds."    
else
   echo "Server is stopped"
fi
    
por david 24.09.2014 / 00:04

3 respostas

12

Primeiro de tudo; "kill -9" deve ser o último recurso.

Você pode usar o comando kill para enviar sinais diferentes para um processo. O sinal padrão enviado por kill é 15 (chamado SIGTERM). Os processos geralmente captam esse sinal, limpam e depois saem. Quando você envia o sinal SIGKILL ( -9 ), um processo não tem escolha a não ser sair imediatamente. Isso pode causar arquivos corrompidos e deixar arquivos de estado e abrir soquetes que podem causar problemas quando você reiniciar o processo. O sinal -9 não pode ser ignorado por um processo.

É assim que eu faria:

#!/bin/bash

# Getting the PID of the process
PID='pgrep gld_http'

# Number of seconds to wait before using "kill -9"
WAIT_SECONDS=10

# Counter to keep count of how many seconds have passed
count=0

while kill $PID > /dev/null
do
    # Wait for one second
    sleep 1
    # Increment the second counter
    ((count++))

    # Has the process been killed? If so, exit the loop.
    if ! ps -p $PID > /dev/null ; then
        break
    fi

    # Have we exceeded $WAIT_SECONDS? If so, kill the process with "kill -9"
    # and exit the loop
    if [ $count -gt $WAIT_SECONDS ]; then
        kill -9 $PID
        break
    fi
done
echo "Process has been killed after $count seconds."

Espero que isso ajude!

    
por 24.09.2014 / 00:53
3

pidof gld_http deve funcionar se estiver instalado no seu sistema.

man pidof diz:

Pidof  finds  the process id’s (pids) of the named programs. It prints those id’s on the standard output.

EDITAR:

Para sua aplicação, você pode usar command substitution :

kill -9 $(pidof gld_http)

Como @arnefm mencionado, kill -9 deve ser usado como último recurso.

    
por 24.09.2014 / 00:30
0

Você também deve verificar /proc/1234 (pid conhecido) se o processo estiver em execução. muita aplicação salvar pid em / var / log para a referência para se certificar de que é o mesmo processo em caso de nome duplicado.

Você pode salvar o pid redirecionando a saída de echo $! > /var/log/gld_http.pid no seu script logo após chamar o programa.

    
por 24.09.2014 / 00:59