Desde una solución zócalo todavía no se ha mencionado, es de destacar que las tomas se pueden utilizar como mutex eficaces. La creación de socket es una operación atómica, como mkdir
es como Gunstick señaló, por lo que un socket es adecuado para usar como un bloqueo o mutex.
La secuencia de comandos de Tim Kay Perl 'Solo' es una secuencia de comandos muy pequeña y efectiva para asegurarse de que solo se puede ejecutar una copia de una secuencia de comandos al mismo tiempo. Fue diseñado específicamente para usarse con trabajos cron, aunque también funciona perfectamente para otras tareas y lo he usado para trabajos que no son de tipo croar de manera muy efectiva.
Solo tiene una ventaja sobre las otras técnicas mencionadas hasta el momento en que la verificación se realiza fuera del script del que solo desea ejecutar una copia. Si la secuencia de comandos ya se está ejecutando, una segunda instancia de esa secuencia de comandos nunca se iniciará. Esto es opuesto a aislar un bloque de código dentro de la secuencia de comandos que está protegido por un bloqueo. EDITAR: Si se usa flock
en un trabajo cron, en lugar de desde dentro de un script, también puede usarlo para evitar que se inicie una segunda instancia del script - vea el ejemplo a continuación.
Aquí hay un ejemplo de cómo se puede utilizar con cron:
*/5 * * * * solo -port=3801 /path/to/script.sh args args args
# "/path/to/script.sh args args args" is only called if no other instance of
# "/path/to/script.sh" is running, or more accurately if the socket on port 3801
# is not open. Distinct port numbers can be used for different programs so that
# if script_1.sh is running it does not prevent script_2.sh from starting, I've
# used the port range 3801 to 3810 without conflicts. For Linux non-root users
# the valid port range is 1024 to 65535 (0 to 1023 are reserved for root).
* * * * * solo -port=3802 /path/to/script_1.sh
* * * * * solo -port=3803 /path/to/script_2.sh
# Flock can also be used in cron jobs with a distinct lock path for different
# programs, in the example below script_3.sh will only be started if the one
# started a minute earlier has already finished.
* * * * * flock -n /tmp/path.to.lock -c /path/to/script_3.sh
Enlaces:
Esperanza esto ayuda.
posible duplicado de [Forma rápida y sucia de garantizar que solo se ejecute una instancia de un script de shell a la vez] (http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only- one-instance-of-a-shell-script-is-running-at) – user