Qual è il modo corretto di verificare se un PID è in esecuzione?


12

Ho un .pidfile e devo verificare se il processo è in esecuzione. Finora ho trovato due opzioni

kill -0 `cat something.pid`

che stampa un errore se il pid non è in esecuzione. So che questo può essere reindirizzato /dev/null, ma mi fa pensare che questa non sia la soluzione migliore.

La seconda soluzione sarebbe quella di utilizzare ps, che tuttavia stampa anche sullo STDOUT

ps -ef `cat something.pid`

È normale reindirizzare l'output /dev/nulle utilizzare semplicemente il codice di stato restituito o è un segno che sto facendo qualcosa di sbagliato e ho bisogno di un comando diverso?


5
Utilizzare kill -0come conforme allo standard (POSIX).
Anders,

Risposte:


9

per la maggior parte delle distro linux che enumerano / proc / {pid} è un buon modo per ottenere informazioni sui processi in esecuzione e di solito su come i comandi di userspace come "ps" comunicano con il kernel. Quindi, per esempio, puoi farlo;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Modifica: dovresti controllare che kpid sia impostato, ma questo è più utile in quanto restituirà "non esiste" per unset $ {kpid}

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

@SteveMuster Questo renderebbe la risposta specifica per Linux. Non esiste / proc su OSX. E penso che non ci sia / proc su BSD.
ash

Nota con questo è necessario assicurarsi che ${kpid}esista
Wilf

@Wilf l'ho modificato, quindi restituisce "processo non esiste" per unset $ {kpid}
Tom H

Grazie - Stavo facendo uno script che controlla un PID usando un metodo simile e non ha funzionato fino a quando ho scoperto che questo era il problema :)
Wilf

6

Come notato da Anders, è necessario utilizzare kill -0per la conformità POSIX.

Sui sistemi Linux, puoi anche verificare l'esistenza di un file nel filesystem / proc, ad es.

-f /proc/$(cat something.pid)/status

1

Se questo è in uno script (che presumo sia il caso in cui sei preoccupato di stampare su stdout), il seguente sarebbe come potresti farlo:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

Gli ps -psguardi per un processo con il PID specificato nel something.pid (la $()sintassi è una versione leggermente più recente del backtick. Backtick ha bisogno di fuggire in determinate circostanze che il nuovo modulo non fa). I 2>&1redirect stderr per questo ordine così.

Se il ps -pcomando non trova il processo con quel PID, esce con un errore> 0 e quindi elseviene eseguito. Altrimenti la killdichiarazione. Puoi negare quanto sopra se lo desideri facendo:

if ! ps -p ...

Spero che risponda alla tua domanda. Ovviamente stai attento e prova molto quando usi comandi pericolosi come kill.


1

Ecco alcune opzioni:

  • Se stai scrivendo init-script (ad es. Quello da inserire /etc/init.d/) e se stai usando una distribuzione basata su Debian, è meglio usare start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Dovresti ottenere il codice di uscita 0 se è in esecuzione.
  • Puoi usare pgrep e pkill dal procpspacchetto:
    pgrep --pidfile $PIDFILE

0

Se hai un file pid puoi usare pgrep per verificare se il processo è in esecuzione:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.