Poiché una soluzione presa non è ancora stato menzionato è opportuno sottolineare che le prese possono essere utilizzati come mutex efficaci. La creazione di socket è un'operazione atomica, come mkdir
è come indicato da Gunstick, quindi una presa è adatta per essere utilizzata come lock o come mutex.
Lo script Perl di Tim Kay "Solo" è uno script molto piccolo ed efficace per assicurarsi che sia possibile eseguire solo una copia di uno script in qualsiasi momento. È stato progettato specificamente per l'uso con i lavori di cron, anche se funziona perfettamente anche per altri compiti e l'ho usato per i lavori non-crob in modo molto efficace.
Solo ha un vantaggio rispetto alle altre tecniche menzionate finora in quanto il controllo viene eseguito al di fuori dello script di cui si desidera eseguire solo una copia. Se lo script è già in esecuzione, una seconda istanza di quello script non verrà nemmeno avviata. Questo è al contrario di isolare un blocco di codice all'interno dello script che è protetto da un blocco. MODIFICA: se flock
viene utilizzato in un processo cron piuttosto che all'interno di uno script, è anche possibile utilizzarlo per impedire l'avvio di una seconda istanza dello script, vedere l'esempio di seguito.
Ecco un esempio di come è possibile utilizzare 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
vicini:
Speranza questo aiuta.
possibile duplicato di [Modo rapido e sporco per garantire che sia in esecuzione una sola istanza di uno script di shell alla volta] (http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only- one-instance-of-a-shell-script-is-running-at) – user