2010-08-26 24 views
6

¿Cómo puedo encontrar un pid por nombre o una línea de comando completa en Ruby, sin tener que llamar a un ejecutable externo?Busque un ID de proceso por nombre

Estoy enviando SIGUSR2 a un proceso cuya línea de comandos contenía ruby job.rb. Me gustaría hacer lo siguiente sin la llamada a pgrep:

uid = Process.uid 
pid = `pgrep -f "ruby job.rb" -u #{uid}`.split("\n").first.to_i 
Process.kill "USR2", pid 
+0

esto no responde a la pregunta, pero si ya estamos haciendo una llamada al sistema externo, también puede matar el proceso allí mismo. P.ej. '\' pgrep -f 'algún trabajo' | xargs kill \ '' – Dennis

Respuesta

4

Apareció una búsqueda rápida en Google con sys_proctable, que debería permitirle hacer esto de forma portátil.

Descargo de responsabilidad: No uso Ruby, no puedo confirmar si esto funciona.

7

Cómo hacer esto depende de su sistema operativo. Asumiendo Linux, puede rastrear manualmente el sistema de archivos/proc y buscar la línea de comando correcta. Sin embargo, esto es lo mismo que pgrep y, de hecho, hará que el programa sea menos portátil.

Algo como esto podría funcionar.

def get_pid(cmd) 
    Dir['/proc/[0-9]*/cmdline'].each do|p| 
    if File.read(p) == cmd 
     Process.kill("USR2", p.split('/')[1]) 
    end 
    end 
end 

Solo tenga cuidado de hurgar en/proc.

+0

Hablando de * menos portátil * - esto no funciona en Solaris. Estás suponiendo que estás ejecutando Linux aquí. – Beano

+4

Sí, dije "asumiendo Linux". – AboutRuby

+0

+1 Se ha aceptado otra respuesta, pero también me gusta. Un recordatorio de cuánto puede hacer en Linux en cualquier idioma con solo el sistema de archivos – Joel

1

Los sistemas basados ​​en Debian encuentran pid con el comando pidof.

Algunas funciones proccess matanza con el rubí:

def killPid(cmd) 
    pid=exec("pidof #{cmd}") 
    Process.kill "USR2", pid 
end 
+1

si ejecuta varias instancias del mismo comando con diferentes parámetros pidof no ayudará –

+0

Esto puede ser peligroso, dependiendo de dónde se encuentre el parámetro procedente de. Está interpolando una cadena en un comando. The String bien puede ser 'prueba; rm -rf/var/www/'. [exec] (https://ruby-doc.org/core-2.4.1/Kernel.html#method-i-exec) puede tomar cosas como esta en múltiples argumentos, por lo que 'exec ('pidof', cmd)' sería mucho más seguro – amenthes

Cuestiones relacionadas