Pregunta

No tengo un nombre de proceso y tengo que enviar una señal kill() a ese proceso, pero necesito su PID para llamar kill(). Sólo me gustaría usar:

popen("pidof process_name");

como la última cosa. ¿Hay alguna otra forma de averiguar el PID del proceso? Una forma de lo que podía pensar es enviar una petición de socket a ese proceso y pedir a su PID.

La otra forma es un poco demasiado complicado para un código simple que estoy escribiendo: hacer lo que del comando pidof código fuente está haciendo realidad (que utiliza una llamada a la función find_pid_by_name() pero que está haciendo un montón de cosas).

Si hay una solución simple es posible, tengo que hacer esto:

system("pkill <process_name>");

y comprobar su código de retorno. Pero va a estar disponible para pkill seguro en todas las máquinas de Linux?

¿Fue útil?

Solución

Usted ha mencionado que estaba usando Linux. No es la solución más limpia, pero se puede ir a través de cada entrada en / proc y comprobar el nombre del proceso en cmdline en contra de lo que busca.

Otros consejos

Usar sysctl - código Ejemplo

EDITAR - que está disponible en Linux ver aquí

Procfs lecturas son muy baratos, muchas personas piensan de iteración a través de / proc como si fuera a través de la iteración /, no es realmente el caso en absoluto.

ahorrar algo de tiempo al omitir cualquier entrada que se encuentra en 1000, no tiene sentido en el examen de los hilos del núcleo. Así que, básicamente .. después de opendir (), si strtoint () piensa que la entrada es un int, int y que es mayor o igual a 1000, acaba de leer / proc /% d / stat.

Trate de evitar la tentación de simplemente resolver el vínculo 'exe', ya que eso no va a decir que el estado del proceso que va a recibir la señal. Por ejemplo, si el objetivo está en 'D' (el sueño de disco) del estado, que te gustaría saber que la señal no será entregado inmediatamente, o tal vez no, si el estado D es perenne.

En la mayoría de los sistemas, que va a ser de 70 -. 120 procesos para examinar y a menudo encontrará su camino de destino antes de llegar al final

Usted menciona, "Una forma de lo que podía pensar es enviar una petición de socket a ese proceso y pedir a su PID." Suena como el proceso que se está tratando de matar es un programa que escribió.

Si ese es el caso, lo canónico que hacer es almacenar el pid en un archivo (normalmente en / var / run, si tiene acceso a ella), mientras que el programa se está ejecutando, y eliminar el archivo al salir del programa . De esa manera, la detección de si o no se ejecuta el programa es tan simple como

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then
    echo Running!
else
    rm -f /var/run/myprog.pid
    echo "Not running."
end

Un estudio cuidadoso de todas las implicaciones del código anterior probablemente le enseñará mucho sobre cómo funcionan los archivos PID. O simplemente puede pedir una explicación más detallada.

Esto parece funcionar bien para mí.

Es posible que desee dar a la ruta completa del proceso, sin embargo, no sea que se mata a un proceso que tiene un nombre similar.

La principal ventaja de esto es que se puede especificar la señal que desea enviar.

system("killall -s 9 process_name");

¿Por qué no usar fcntl con F_GETOWN?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top