logo - ¿Cuál es la mejor manera de asegurarse de que solo se esté ejecutando una instancia de un programa Perl?
perl vs python (3)
Hay muchas formas de hacerlo. Los archivos PID son la forma tradicional de hacerlo. También podría mantener un bloqueo en un archivo, por ejemplo, el programa en sí. Esta pequeña porción de código hará el truco:
use Fcntl '':flock'';
open my $self, ''<'', $0 or die "Couldn''t open self: $!";
flock $self, LOCK_EX | LOCK_NB or die "This script is already running";
Una ventaja sobre los archivos PID es que los archivos se desbloquean automáticamente cuando el programa sale. Es mucho más fácil de implementar de manera confiable.
Hay varias formas de hacerlo, pero no estoy seguro de cuál de ellas es la mejor.
Esto es lo que puedo pensar:
- Busque el proceso usando pgrep.
- Haga que el script se bloquee usando flock, y luego verifique si está bloqueado cada vez que se ejecuta.
- Cree un archivo pid en /var/run/program_name.pid y verifique si existe, y compare los pids si es necesario.
Probablemente haya más formas de hacer esto. ¿Cuál crees que es el mejor enfoque?
Haz el viejo truco del archivo PID.
- iniciar proceso
- ver si hay un archivo llamado "myprog.PID"
- verificar la existencia de un proceso en ejecución con PID coincidente usando kill 0, $ pid
- si el nombre del prog PID proc. partidos, quejarse en voz alta y salir
- si no, borre "myprog.PID" añejo
- crea un archivo llamado "myprog.PID" y luego continúa
HTH
aclamaciones,
Robar
Todas las opciones que enumeras están bien. Una cosa con esto, sin embargo, es tener en cuenta que en casos raros, puede terminar con un proceso que se ejecuta durante un tiempo muy largo (es decir, atascado esperando algo). Es posible que desee pensar en vigilar cuánto tiempo ha estado funcionando la otra instancia en ejecución y posiblemente enviarse una alerta si excede una cierta cantidad de tiempo (como, por ejemplo, un día).