Estoy escribiendo un script de Perl que analiza los archivos de registro para recopilar PID y luego comprueba si ese PID se está ejecutando. Estoy tratando de pensar en la mejor manera de hacer esa verificación. Obviamente, podría hacer algo como:
system("ps $pid > /dev/null") && print "Not running\n";
Sin embargo, preferiría evitar la llamada al sistema si es posible. Por lo tanto, pensé que podría usar el /proc
sistema de archivos (la portabilidad no es una preocupación, esto siempre se ejecutará en un sistema Linux). Por ejemplo:
if(! -d "/proc/$pid"){
print "Not running\n";
}
¿Eso es seguro? ¿Puedo suponer siempre que si no hay un /proc/$pid/
directorio, el PID asociado no se está ejecutando? Lo espero ya que AFAIK ps
obtiene su información de /proc
todos modos, pero como esto es para el código de producción, quiero estar seguro.
Entonces, ¿puede haber casos en que un proceso en ejecución no tenga un /proc/PID
directorio o donde /proc/PID
exista un directorio y el proceso no se esté ejecutando? ¿Hay alguna razón para preferir el análisis antes que ps
verificar la existencia del directorio?
kill -0
sea el mejor), esto solo le indica si hay un proceso en ejecución con el PID dado . No le dice si el proceso seguirá ejecutándose un milisegundo más tarde, y no le dice si el proceso es el que le interesa o si es un proceso no relacionado al que se le asignó el mismo PID después de que el proceso interesante falleció. . Casi siempre es un error probar si se está ejecutando un PID dado : hay muy pocas circunstancias en las que esto no sea propenso a las condiciones de carrera.
kill
función perl que usa la señal 0, que no mata pero dice si puede hacerlo (es decir, necesita permiso para señalar ese proceso).