Comprobar si el proceso existe dado su pid

5 minutos de lectura

avatar de usuario
simone

Dado el pid de un proceso de Linux, quiero verificar, desde un programa C, si el proceso aún se está ejecutando.

  • Es posible que desee ver esto: stackoverflow.com/questions/939778/…

    – extremo

    5 de febrero de 2012 a las 21:07

avatar de usuario
Blagovest Büyükliev

emitir un kill(2) llamada al sistema con 0 como la señal. Si la llamada tiene éxito, significa que existe un proceso con este pid.

Si la llamada falla y errno se establece en ESRCHno existe un proceso con tal pid.

Citando el estándar POSIX:

Si sig es 0 (la señal nula), se realiza la comprobación de errores pero no se envía realmente ninguna señal. La señal nula se puede utilizar para comprobar la validez de pid.

Tenga en cuenta que no está a salvo de las condiciones de carrera: es posible que el proceso de destino haya salido y mientras tanto se haya iniciado otro proceso con el mismo pid. O el proceso puede cerrarse muy rápidamente después de que lo verifique, y podría tomar una decisión basada en información desactualizada.

Solo si el pid dado es de un proceso secundario (fork‘ed desde el actual), puede utilizar waitpid(2) con el WNOHANG opción, o tratar de atrapar SIGCHLD señales Estos están a salvo de las condiciones de carrera, pero solo son relevantes para los procesos secundarios.

  • El éxito de la llamada no significa que el proceso exista. Significa algunos existe un proceso con ese PID, que puede o no ser el proceso sobre el que quería saber.

    –David Schwartz

    5 de febrero de 2012 a las 21:27

  • los kill El método es seguro si y solo si el proceso que está probando es su propio proceso secundario. En este caso, la identificación del proceso le pertenece a usted y no puede reutilizarse hasta que wait para ello. De lo contrario, cualquier uso de un pid es un error grave.

    – R.. GitHub DEJA DE AYUDAR A ICE

    5 de febrero de 2012 a las 23:15

  • Después de seguir su ejemplo y de la página man de kill() Obtengo el valor de retorno -1 en lugar del ESRCH esperado. ¿Hay algo que estoy haciendo mal? perror() da No such process.

    – Marvin Effing

    13 de febrero de 2019 a las 14:40

  • @MarvinEffing Sé que esta es una respuesta anterior, pero en caso de que ayude a alguien más, debe verificar errno en lugar de. El código de retorno de kill() será -1 si hay un error. Esto se señala en la respuesta y también en el documentación.

    – SRG

    3 de noviembre de 2019 a las 14:14

Utilice procf.

#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
  // process doesn't exist
}

Fácilmente portátil para

  • Solaris
  • IRIX
  • Tru64 UNIX
  • BSD
  • linux
  • IBMAIX
  • QNX
  • Plan 9 de Bell Labs

kill(pid, 0) es el enfoque típico, como dijo @blagovest-buyukliev. Pero si el proceso que está comprobando puede ser propiedad de un usuario diferente y no desea realizar los pasos adicionales para comprobar si errno == ESRCHResulta que

(getpgid(pid) >= 0)

es un método efectivo de un solo paso para determinar si algún proceso tiene el PID dado (ya que puede inspeccionar el ID del grupo de procesos incluso para los procesos que no le pertenecen).

  • A veces, el proceso sale pero getpgid(pid) aún devuelve un valor positivo.

    – tianyapiaozi

    17 de enero de 2019 a las 3:00

  • @tianyapiaozi sospecho que si ese es el caso, el proceso tiene salió pero aún no ha sido cosechado (el registro del proceso aún existe en un estado “zombie” hasta que el proceso principal lo verifica para obtener su valor de retorno). Sin embargo, tiene razón, no está estrictamente definido lo que significa aquí si un proceso “existe”. Estoy bastante seguro, al menos, de que si esta expresión es verdadera, entonces kill(pid, 0) también va a.

    – el pablo

    17 de enero de 2019 a las 19:38

avatar de usuario
Hallvard

Puede emitir un kill(2) llamada al sistema con 0 como la señal.

No hay nada inseguro en kill -0. El programa debe ser consciente de que el resultado puede volverse obsoleto en cualquier momento (incluido que el pid puede reutilizarse antes de que se llame a kill), eso es todo. Y usando procfs en su lugar lo hace use el pid también, y hacerlo de una manera más engorrosa y no estándar.

Como complemento al método del sistema de archivos /proc, puede verificar /proc//cmdline (asumiendo que se inició desde la línea de comando) para ver si es el proceso que desea.

  • commandline tiene dos significados: uno (el que está en /proc//cmdline) es “el nombre del programa que se ejecuta, con una lista de argumentos que se le pasan”) se aplica a CADA proceso, incluso si no se inicia desde el ” línea de comando” (significado diferente: una interfaz basada en texto en beneficio de los seres humanos).

    – AMADANÓN Inc.

    23 de septiembre de 2014 a las 3:19

avatar de usuario
J. Chomel

ps -p $PID > /dev/null 2>&1;   echo $?

Este comando regresa 0 si proceso con $PID todavía está funcionando. De lo contrario vuelve 1.

También se puede usar este comando en la terminal OSX.

  • commandline tiene dos significados: uno (el que está en /proc//cmdline) es “el nombre del programa que se ejecuta, con una lista de argumentos que se le pasan”) se aplica a CADA proceso, incluso si no se inicia desde el ” línea de comando” (significado diferente: una interfaz basada en texto en beneficio de los seres humanos).

    – AMADANÓN Inc.

    23 de septiembre de 2014 a las 3:19

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad