¿Cuál es una forma adecuada de verificar si se está ejecutando un PID?

12

Tengo un .pidarchivo y necesito verificar si el proceso se está ejecutando. Hasta ahora encontré dos opciones

kill -0 `cat something.pid`

que imprime un error si el pid no se está ejecutando. Sé que esto se puede redirigir /dev/null, pero me hace pensar que esta no es la mejor solución.

La segunda solución sería usar ps, que sin embargo también se imprime en STDOUT

ps -ef `cat something.pid`

¿Es normal redirigir la salida /dev/nully simplemente usar el código de estado devuelto, o es una señal de que estoy haciendo algo mal y necesito un comando diferente?

Jakub Arnold
fuente
55
Úselo kill -0como es estándar (POSIX).
Anders

Respuestas:

9

para la mayoría de las distribuciones de Linux, enumerar / proc / {pid} es una buena manera de obtener información sobre los procesos en ejecución y, por lo general, cómo los comandos del espacio de usuario como "ps" se comunican con el núcleo. Entonces, por ejemplo, puedes hacer;

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

Editar: debe verificar que kpid esté configurado, pero esto es más útil ya que devolverá "no existe" por $ {kpid} no establecido

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"
Tom H
fuente
@SteveMuster Esto haría que la respuesta sea específica de Linux. No hay / proc en OSX. Y creo que no hay / proc en BSD.
ceniza
Tenga en cuenta que con esto debe asegurarse de que ${kpid}exista
Wilf
@Wilf Lo edité, por lo que devuelve "el proceso no existe" por $ {kpid} sin configurar
Tom H
Gracias. Estaba haciendo un script que verificaba un PID usando un método similar y no funcionó hasta que descubrí que este era el problema :)
Wilf
6

Como Anders señaló, debe usar kill -0para el cumplimiento POSIX.

En los sistemas Linux, también puede verificar la existencia de un archivo en el sistema de archivos / proc, por ejemplo,

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

Si esto está en un script (que supongo que es el caso, ya que le preocupa imprimir en stdout), entonces lo siguiente sería cómo podría hacerlo:

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

Las ps -pmiradas de un proceso con el PID especificado en something.pid (la $()sintaxis es una versión ligeramente más reciente de la tilde. Backtick necesita escapar en ciertas circunstancias que la nueva forma no lo hace). Los 2>&1redireccionamientos stderr para ese comando también.

Si el ps -pcomando no encuentra el proceso con ese PID, sale con un error> 0 y elsese ejecuta. De lo contrario, la killdeclaración. Puede negar lo anterior si lo desea haciendo:

if ! ps -p ...

Espero que responda tu pregunta. Obviamente, tenga cuidado y pruebe mucho cuando use comandos peligrosos como kill.

Webtoe
fuente
1

Aquí hay algunas opciones:

  • Si está escribiendo init-script (por ejemplo, el que debe colocar /etc/init.d/) y si está usando una distribución basada en Debian, será mejor que use start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Debería obtener el código de salida 0 si se está ejecutando.
  • Puede usar pgrep y pkill del procpspaquete:
    pgrep --pidfile $PIDFILE
bandera pirata
fuente
0

Si tiene un archivo pid, puede usar pgrep para verificar si el proceso se está ejecutando:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
Dima L.
fuente