A veces, cuando hago un proceso que quiero que solo esté presente una sola instancia de él, lo que hago es colocar, al principio del programa, una comprobación de que efectivamente, no hay ningún otro programa como él ejecutándose. Y si lo hay, comenzar un bucle de espera, para que termine el proceso anterior. O cerramos la aplicación porque es inútil esperar.
Casos así pueden ocurrir en los programas que se ejecutan desde el cron. Algunos pueden tardar mucho, así que no tiene sentido que se ejecute una segunda instancia del programa.
Algo así (muy básico):
Using perl Syntax Highlighting
my $nosotros = basename $0; # $0 es la ruta completa de este programa. Con File::Basename nos quedamos solo con el nombre
my @ps;
do {
# sacamos un listado de todos los programas en ejecución, que se llamen igual que $nosotros,
# pero que no seamos nosotros (el PID del programa está en $$), ni que sea el editor de textos joe
# (quizás estamos reeditando el programa en otra pantalla)
@ps = grep { !/$$|joe/ } grep { /$nosotros/ } qx(ps aux);
sleep rand(60) if @ps; # si hay algún programa igual, esperamos algo así como un minuto
} while @ps; # y volvemos a mirar
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Depende un poco de las circunstancias en que se ejecute ese proceso...
Otro caso es cuando hay usuarios en la web que se empeñan en hacer doble clic en los botones de envío, cuando solo hace falta hacer uno.