2008-12-17 12 views
5

Tengo un nombre de proceso y debo enviar una señal kill() a ese proceso, pero necesito su PID para llamar al kill(). Solo me gustaría utilizar:Buscar PID de un proceso por nombre sin usar popen() o system()

popen("pidof process_name"); 

como la última cosa. ¿Hay alguna otra forma de averiguar el proceso 'PID? Una forma en que podría pensar es enviar una solicitud de socket a ese proceso y solicitar su PID.

La otra forma es un poco complicada para un código simple que estoy escribiendo: hacer lo que realmente está haciendo pidof command's source code (usa una llamada a la función find_pid_by_name() pero eso está haciendo muchas 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 estará disponible pkill en todas las máquinas Linux?

Respuesta

4

Mencionaste que usabas linux. No es la solución más limpia, pero puede revisar cada entrada en/proc y verificar el nombre del proceso en cmdline con respecto a lo que está buscando.

+0

debería ser bastante directo usando boost :: regex y boost :: filesystem creo que –

+0

una vez busqué en la salida strace de pidof, y pensé que lo haría de la misma manera. (puede haber cambiado entre medio, sin embargo) –

+2

lecturas de procfs son MUY baratas. Para este propósito en particular, no tendrías que comenzar realmente a leer hasta que llegues a PID 1000, entonces tienes 40 - 60 para examinar. No lo piense como leer un FS convencional, es mucho más barato. –

0

Esto parece funcionar bien para mí.

Sin embargo, es posible que desee indicar la ruta completa del proceso, para evitar que se mate un proceso que tiene un nombre similar.

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

system("killall -s 9 process_name"); 
+0

Esto no es diferente de la versión pkill ... –

0

¿por qué no usar fcntl con F_GETOWN?

+0

Eso funciona solo si se llama a fcntl en un descriptor de socket y se debe tener cuidado para darse cuenta si se obtiene un PID o un grupo de proceso (un resultado negativo de fcntl). Llamar a fcntl en un archivo normal con F_GETOWN no ​​está especificado en POSIX. http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html –

2

Las lecturas de Procfs son muy baratas, muchas personas piensan en iterar a través de/proc como si estuvieran recorriendo//, realmente no es el caso en absoluto.

Ahorre tiempo omitiendo cualquier entrada que esté por debajo de 1000, no tiene sentido examinar los hilos del kernel. Entonces, básicamente ... después de opendir(), si strtoint() cree que la entrada es un int, y que int es mayor o igual a 1000, solo lea/proc /% d/stat.

Trate de evitar el impulso de simplemente resolver el enlace 'exe', ya que eso no le informará el estado del proceso que recibirá la señal. Por ejemplo, si el objetivo está en el estado 'D' (suspensión de disco), querrá saber que la señal no se enviará inmediatamente, o quizás nunca, si el estado D es perenne.

En la mayoría de los sistemas, habrá entre 70 y 120 procesos para examinar y, a menudo, encontrará su destino antes de llegar al final.

+0

@tinkertim: Gracias por la sugerencia, no sabía leer en/proc no es como leer un FS! – Srikanth

2

Usted menciona: "Una forma en que podría pensar es enviar una solicitud de socket a ese proceso y solicitar su PID". Parece que el proceso que intentas matar es un programa que escribiste.

Si ese es el caso, lo más canónico es almacenar el pid en un archivo (generalmente bajo/var/run, si tiene acceso) mientras el programa se está ejecutando, y eliminar el archivo cuando el programa salidas.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 

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.

Cuestiones relacionadas