¿Cómo puedo estar seguro de una sola copia de un script de Perl se está ejecutando en un momento?

StackOverflow https://stackoverflow.com/questions/3966472

  •  09-10-2019
  •  | 
  •  

Pregunta

necesito para asegurarse de que sólo una copia de mi script de Perl está funcionando a la vez. De acuerdo con las sugerencias aquí escribí un sub para hacer el registro de entrada:

sub check_instances {
    open my $fh, '<', $0 or die $!; 

    unless (flock($fh, LOCK_EX|LOCK_NB)) {
        print "$0 is already running. Exiting.\n";
        exit 1;
    } 
}

Pero no funciona. ¿Cuál puede ser el problema?

¿Fue útil?

Solución

Usted está utilizando un gestor de archivo léxica restringidos al interior de la sub. Cuando vuelve check_instances, el gestor de archivo se cierra automáticamente, lo que libera el bloqueo. Así que usted nunca verá un conflicto menos dos copias comprobar exactamente al mismo tiempo.

Asegúrese de que los restos gestor de archivo abierto, siempre y cuando se ejecuta el script (o el tiempo que desea mantener el bloqueo). Por ejemplo:

{
my $fh;
sub check_instances {
    return if $fh; # We already checked
    open $fh, '<', $0 or die $!; 

    unless (flock($fh, LOCK_EX|LOCK_NB)) {
        print "$0 is already running. Exiting.\n";
        exit 1;
    } 
}
} # end scope of $fh

Esto también sería un lugar bueno utilizar una state variables , si es posible requerir Perl 5.10.

Otros consejos

Puede comprobar la lista de procesos para otros casos ( Proc :: ProcessTable puede ayudar), pero una ruta común adoptada por programas UNIX en muchos idiomas es crear un archivo pid - vea archivo :: Pid .

La semántica normales de flock posible que tenga que abrir el gestor de archivo en modo de escritura, por ejemplo,

open $fh, '>>', $0;
open $fh, '+<', $0;

( perldoc -f flock )

Nota que el fcntl (2) de emulación del rebaño (3) requiere que FILEHANDLE ser abierto con leer la intención de usar y no requiere LOCK_SH que sea abierto con la intención de usar escritura LOCK_EX.

El bloqueo de archivos puede fallar por diversas razones (por ejemplo, si el archivo está en un sistema de archivos de red como NFS).

Mi solución es crear un directorio mientras se ejecuta el script. La creación de directorios es siempre una operación atómica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top