macos shell file-locking

macos - Mac OS X equivalente al comando flock(1) de Linux



shell file-locking (8)

¿Está buscando flock la utilidad de línea de comandos o flock the feature?

flock(1) no está disponible en OS X. flock(2) (la función C para el bloqueo de archivos), sin embargo , no está disponible .

Escribir una utilidad de línea de comando simple flock(1) usando flock(2) debe ser trivial.

¿Hay un comando de bandada en Mac OS X que administra el bloqueo de archivos?

http://linux.die.net/man/1/flock


Hay un comando de bandada multiplataforma aquí:

https://github.com/discoteq/flock

Lo he probado y funciona bien en OSX como reemplazo directo de la bandada de util-linux.


No creo que el comando flock exista en OS X, pero sí existe en BSD, lo que debería hacer que sea bastante fácil de migrar a OS X.

Lo más cercano que está disponible es el comando shlock ( página del manual ), pero no es tan robusto o seguro como el flock .

Su mejor opción puede ser ver cómo transferir la versión de Linux o BSD de flock a OS X.


No hay comando de flock en OS X, no. Si necesita un script de shell que pueda compartir un recurso bloqueable con programas que utilicen la llamada del sistema flock para administrar el acceso a ese recurso, tendrá que crear dicho programa: compile la fuente BSD usted mismo o escriba su propio programa equivalente ( quizás en Perl o Ruby o algún otro lenguaje que exponga el flock como parte de su interfaz de sistema de alto nivel).

Sin embargo, si todo lo que necesita es una forma de sincronizar el acceso a un archivo desde un shellscript, y no tiene otros programas escritos intentando hacerlo con flock , puede usar el comando lockfile , que viene con el paquete procmail . . OS X solía enviarse con procmail ; ya no lo hace, pero puede instalarlo a través de, por ejemplo, Homebrew .


No puede escribir un comando flock (1) a nivel de shell para usar en la programación de shell debido a cómo funciona el bloqueo de archivos. El bloqueo está en el descriptor, no en el inodo o la entrada de directorio.

Por lo tanto, si implementa un comando de shell que floca en algo, tan pronto como el comando de bloqueo sale y el script de shell pasa al siguiente comando, el descriptor que mantuvo el bloqueo desaparece y, por lo tanto, no se retiene ningún bloqueo.

La única forma de implementar esto sería como un shell incorporado. Como alternativa, debe volver a escribir en un lenguaje de programación que realmente admita flock (2) directamente, como Perl.


Para completar, puede compilar flock (2) para OSX con algunos cambios menores, no he realizado ninguna prueba, pero la funcionalidad básica funciona.

Puede obtener la fuente en ftp://ftp.kernel.org//pub/linux/utils/util-linux . Luego, debe reemplazar algunas llamadas a funciones de cadena que no están disponibles en OSX, y ya está listo.

Aquí: https://gist.github.com/Ahti/4962822 es mi flock.c modificado de la versión 2.22.1, aún necesita las otras fuentes para los encabezados.


Perl de una sola línea:

perl -MFcntl=:flock -e ''$|=1; $f=shift; print("starting/n"); open(FH,$f) || die($!); flock(FH,LOCK_EX); print("got lock/n"); system(join(" ",@ARGV)); print("unlocking/n"); flock(FH,LOCK_UN); '' /tmp/longrunning.sh /tmp/longrunning.sh

Como guión:

#!/usr/bin/perl # emulate linux flock command line utility # use warnings; use strict; use Fcntl qw(:flock); # line buffer $|=1; my $file = shift; my $cmd = join(" ",@ARGV); if(!$file || !$cmd) { die("usage: $0 <file> <command> [ <command args>... ]/n"); } print("atempting to lock file: $file/n"); open(FH,$file) || die($!); flock(FH,LOCK_EX) || die($!); print("got lock/n"); print("running command: $cmd/n"); system($cmd); print("unlocking file: $file/n"); flock(FH,LOCK_UN);