2011-07-29 20 views
20

Estoy buscando mutex/semaphore/concurrency mecanismo en shell script. Considere la siguiente situación: A menos que el usuario "a" no cierre el archivo compartido, el usuario "b" no podrá abrirlo/actualizarlo. Me pregunto cómo implementar el mecanismo mutex, semaphore, critical sections en el shell scripting.¿Hay algún mecanismo mutex/semáforo en los scripts de shell?

¿Cuál es la forma más fácil de implementar locking mechanism [nivel de archivo] en shell scripting?

+2

posible duplicado de [Forma rápida y sucia para 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) – tripleee

+0

Relacionado: https://unix.stackexchange.com/questions/70/what-unix-commands-can-be- used-as-a-semáforo-lock –

Respuesta

9

Consulte BashFAQ y ProcessManagment para ver las discusiones sobre el bloqueo de archivos en Bash.

Etiquetar su pregunta como shell (únicamente) limita el número de personas que pueden ayudarlo. Es posible que desee agregar unix, ksh, bash.

Hay numerosas preguntas/respuestas sobre este tema publicadas aquí ya en S.O.

Espero que esto ayude.

+5

si es un duplicado, ¿puede señalar uno en particular? – momeara

+1

No dije que era un duplicado, la intención era apuntar a un usuario relativamente nuevo para buscar un poco más a fondo a través de S.O. Busqué '[bash] file lock' y' [bash] mutex' y encontré numerosos que agregarían perspectiva. Buena suerte. – shellter

31

El BashFAQ observado por shellter tiene algunos buenos ejemplos. La idea básica, que me estoy moviendo aquí para que la página sea independiente, es usar una operación que pruebe y establezca al mismo tiempo: mkdir

mkdir fallará si el directorio existe y lo hará si no es asi. Es una operación atómica y se puede usar como tal para hacer un mutex en el script de shell (del BashFAQ anterior)

# Bourne 
lockdir=/tmp/myscript.lock 
if mkdir "$lockdir" 
then # directory did not exist, but was created successfully 
    echo >&2 "successfully acquired lock: $lockdir" 
    # continue script 
else # failed to create the directory, presumably because it already exists 
    echo >&2 "cannot acquire lock, giving up on $lockdir" 
    exit 0 
fi 

Siga el enlace para más detalles sobre la limpieza y otros artículos.

+4

El objetivo del bloqueo no es sostenerse hasta que se suelte el bloqueo. ¿Debería esta secuencia de comandos ser como mkdir dentro de un ciclo while hasta que tenga éxito y una vez que se termine el trabajo, se supone que el script eliminará el tmp dir? – Pocha

+0

@Pocha esa es una de las formas en que podría funcionar, pero también podría querer que la secuencia de comandos se cierre con una explicación, es por eso que vine aquí). Si el comportamiento descrito es el que desea, debería ser posible modificar esta respuesta para lograrlo. – joelnb

Cuestiones relacionadas