Si hay más de una forma, indíquelas. Solo sé de uno, pero me pregunto si hay una manera más limpia, de Ruby.¿Cómo puedo verificar desde Ruby si se está ejecutando un proceso con un determinado pid?
Respuesta
Si se trata de un proceso que espera ser "suyo" (por ejemplo, está utilizando esto para validar un pid para un proceso que controla), puede simplemente enviarle sig 0.
>> Process.kill 0, 370
=> 1
>> Process.kill 0, 2
Errno::ESRCH: No such process
from (irb):5:in `kill'
from (irb):5
>>
Usted puede intentar usar
Process::kill 0, pid
donde pid es el número PID, si el PID está ejecutando debe devolver 1.
@ John T, @Dustin: En realidad, chicos, Analicé el Proceso rdocs, y se ve como
Process.getpgid(pid)
es un medio menos violento de aplicar la misma técnica.
Encontré que esto puede devolver falsos positivos (informa que se ejecuta cuando en realidad no fue así) en el último Ubuntu. No sé por qué pero en este hilo solo la solución de @balu pareció funcionar para mí. – iain
Supongo que esta no es una solución multiplataforma. (No funciona en Windows, ¿verdad?) – Ajedi32
Creo que la implicación aquí es que 'kill 0' es 'violento' - esto es un error. Los documentos dicen: "Si sig es 0, entonces no se envía ninguna señal, pero todavía se realiza la comprobación de errores, esto se puede utilizar para verificar la existencia de una ID de proceso o ID de grupo de proceso". – Ray
La diferencia entre los enfoques Process.getpgid
y Process::kill
parece ser lo que sucede cuando el pid existe pero es propiedad de otro usuario. Process.getpgid
devolverá una respuesta, Process::kill
lanzará una excepción (Errno::EPERM)
.
Basado en eso, recomiendo Process.getpgid
, solo por el hecho de que le evita tener que atrapar dos excepciones diferentes.
Aquí está el código que utilizo:
begin
Process.getpgid(pid)
true
rescue Errno::ESRCH
false
end
¿Cómo elimino un proceso propiedad de otro usuario? – Luccas
oneliner: '(Process.getpgid (pid) rescue nil) .present?' –
Para los procesos secundarios, otras soluciones como el envío de una señal no se comportará como se espera: van a indicar que el proceso todavía está en marcha, cuando en realidad se cierra.
Puede usar Process.waitpid si desea verificar un proceso que generó usted mismo. La llamada no se bloqueará si está utilizando el indicador Process::WNOHANG
y nil
se devolverá siempre que el proceso hijo no haya finalizado.
Ejemplo:
pid = Process.spawn('sleep 5')
Process.waitpid(pid, Process::WNOHANG) # => nil
sleep 5
Process.waitpid(pid, Process::WNOHANG) # => pid
Si el PID no pertenece a un proceso hijo, se lanzará una excepción (Errno::ECHILD: No child processes
).
Lo mismo se aplica al Process.waitpid2.
Encontré que esto es más confiable que las soluciones mencionadas anteriormente. ¡Gracias! – iain
Gracias, esa es la respuesta más confiable para procesos engendrados. Para procesos no generados por nosotros, las otras soluciones están bien. – akostadinov
Esta parece ser la única respuesta que funciona en Windows, al menos para mí: D – DarkWiiPlayer
A *nix
-sólo un acercamiento sería pagar hasta ps
y comprobar si existe un delimitador \n
(nueva línea) en la cadena devuelta.
Ejemplo IRB salida
1.9.3p448 :067 > `ps -p 56718`
" PID TTY TIME CMD\n56718 ttys007 0:03.38 zeus slave: default_bundle \n"
Empaquetado como un método
def process?(pid)
!!`ps -p #{pid.to_i}`["\n"]
end
En Linux se puede obtener una gran cantidad de atributos de funcionamiento Programm utilizando el sistema de archivos proc:
File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")
He tratado este problema antes y ayer lo compilé en la gema "process_exists".
Envía la señal nula (0) al proceso con el pid dado para verificar si existe. Funciona incluso si el usuario actual no tiene permisos para enviar la señal al proceso de recepción.
Uso:
require 'process_exists'
pid = 12
pid_exists = Process.exists?(pid)
Ésta es la forma en que he estado haciendo:
def alive?(pid)
!!Process.kill(0, pid) rescue false
end
No sabía que se puede rescatar así de genial – redcodefinal
Por lo general, no siempre querrás usar 'rescue' así, pero parece justificable aquí. –
Esto funcionó para mí cuando yo era si una canción se está reproduciendo en un código Ruby
def process_running?(pid)
return true if pid
false
end
def play_song_for_real
@process_id = fork { exec 'afplay', $song_path }
end
si marca process_running(@process_id)
obtendrá verdadero si el proceso se está ejecutando o es falso si no es
Esto no funcionará. Por ejemplo, si pongo 'process_running? (1)' producirá 'true' porque' 1' no es 'nil' o' false'. – redcodefinal
Funcionó porque había inicializado pid al process_id. como este 'def play_song_for_real @process_id = fork {exec 'afplay', $ song_path} end' El método' process_running? ', simplemente comprueba si el proceso se está ejecutando y paso el' @ process_id'. Nuevamente, corríjame si me equivoco, quizás funcionó porque tuve suerte (^^) – Hanmaslah
Deberías asegurarte de explicar que en tu ejemplo, mirarlo sin ese conocimiento podría causar malentendidos. La forma en que la mayoría de nosotros esperaría que funcione es tomar un pid entero, no un objeto pid. – redcodefinal
- 1. ¿Cómo verificar si se está ejecutando un proceso con un PID determinado?
- 2. ¿Cómo verificar si un proceso se está ejecutando con Delphi?
- 3. ¿Cómo puedo saber si un proceso se está ejecutando?
- 4. En Python, sin usar el sistema de archivos/proc, ¿cómo puedo saber si se está ejecutando un PID determinado?
- 5. Comprobar si el proceso se está ejecutando
- 6. Cómo verificar si existe un directorio determinado en Ruby
- 7. Dentro de un archivo por lotes, ¿cómo puedo saber si se está ejecutando un proceso?
- 8. ¿Está usando GetProcessesByName la mejor manera de verificar si un proceso se está ejecutando?
- 9. ¿Cómo verificar un proceso en ejecución con Ruby?
- 10. ¿Cómo verificar si una fecha está en un rango determinado?
- 11. ¿Cómo verificar con inno-setup, si un proceso se está ejecutando en un windows 2008 r2 64bit?
- 12. ¿Cómo puedo verificar si se está ejecutando un servicio de Windows?
- 13. Powershell: si un proceso no se está ejecutando, inícielo
- 14. ¿Cómo puedo verificar si un programa se está ejecutando por primera vez?
- 15. Cómo verificar un script bash si algo se está ejecutando y salir si es
- 16. ¿Cómo puedo verificar si actualmente se está visualizando un UIViewController?
- 17. ¿Cómo rastrear el script PHP ejecutando un proceso determinado?
- 18. Comprobando si el proceso aún se está ejecutando?
- 19. Esperar a que un determinado proceso (conociendo el "PID") final
- 20. C++, ¿Cómo determinar si se está ejecutando un proceso de Windows?
- 21. ¿Cómo puedo saber si un proceso ya se está ejecutando usando C#?
- 22. ¿Cómo puedo saber si un proceso se está ejecutando en C?
- 23. ¿Cómo verificar si el servidor X se está ejecutando?
- 24. Java: Obtenga un proceso dado un pid
- 25. ¿Cómo puedo determinar si mi proceso se está ejecutando de forma interactiva?
- 26. ¿Cómo comprobar si existe un proceso con un pid dado en Python?
- 27. ¿Se está ejecutando un proceso en una máquina remota?
- 28. ¿Cómo verificar si un tipo sobrecarga/admite un determinado operador?
- 29. ¿Cómo verifica en Linux con Python si todavía se está ejecutando un proceso?
- 30. ¿Cómo puedo detectar si un programa se está ejecutando desde dentro de valgrind?
¡Un interesante enfoque! Voy a investigar esto. – Pistos
Dang, pásame. Vi las "nuevas respuestas se han publicado" cosa y mi corazón se hundió :( –
Pero ¿cuál es la señal 0? Anoop? – Pistos