2012-05-10 24 views

Respuesta

2

No creo que existe el comando flock en OS X, pero existe en BSD lo que debería hacer razonablemente fácil de portar a OS X.

Lo más cerca que está disponible es el comando shlock (man page), pero no es tan robusto ni seguro como flock.

Su mejor opción puede ser la de mirar a portar ya sea la versión de Linux o BSD de flock a OS X.

1

¿Está buscando una flock la utilidad de línea de comandos o flock la característica?

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

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

-5

No se puede escribir un comando (0) (0) del nivel de shell para su uso en la programación del shell debido al funcionamiento del bloqueo de archivos. El bloqueo está en el descriptor, no en el inodo ni en la entrada del directorio.

Por lo tanto, si implementa un comando de shell que agrupa algo, tan pronto como sale el comando de bloqueo y el script de shell pasa al siguiente comando, desaparece el descriptor que contiene el bloqueo y no se retiene el bloqueo.

La única forma de implementar esto sería como un shell incorporado. Alternativamente, debe reescribir en un lenguaje de programación que realmente sea compatible con flock (2) directamente, como Perl.

+0

Linux [flock (1)] (http://linux.die.net/man/1/flock) no es un contenedor trivial alrededor de flock (2). – Gilles

+0

¿Lo entiendo bien? El bloqueo solo se mantiene mientras el proceso se esté ejecutando. Por lo tanto, una envoltura simple alrededor de la bandada (2) mantendría la cerradura solo un slong mientras se está ejecutando. En una secuencia de comandos, la cerradura se liberaría antes de que se llame al siguiente comando, ¿verdad? – jboi

+2

@jboi - el comando flock (1) toma un comando de shell (que se ejecuta mientras se mantiene el bloqueo) o el número de un descriptor de archivo que se debe bloquear; en este último caso, el descriptor de archivo se abre en el llamador (si es un script de shell, que usa '' exec 9> $ LOCKFILE'' o similar) y permanece abierto después de que sale el comando flock. En cuanto a la afirmación de @tchrist de que no se puede escribir una bandada de nivel de shell, bueno, yo creería (casi) cualquier cosa que diga sobre Perl, pero en esta se equivoca. El comando flock ejecuta los comandos bloqueados (si se pasa un nombre de archivo) o se pasa un número de descriptor de archivo. ¡Funciona! –

10

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 un 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); 
+2

@Yan En el futuro, probablemente no deba hacer cambios de código en la respuesta de otra persona. Siéntase libre de enviar su edición sugerida como un comentario y deje que el autor haga la llamada para saber si quiere cambiar su respuesta o no (9 de cada 10 veces, si es un error, lo arreglarán). No dude en editar respuestas para cambios sustanciales para mayor claridad o formato, pero no cambie la respuesta en sí. – Rob

+1

Tenga en cuenta que esta emulación Perl es muy incompleta: solo admite el formato '' FILE COMMANDS ... '' y no el formulario '' flock FD'' (tampoco admite ninguna de las opciones de flock (1)). –

1

sólo por el bien completo, puede compilar rebaño (2) para OSX con algunos cambios menores, tengo no ejecuta ninguna prueba, pero la funcionalidad básica funciona.

Puede obtener la fuente desde 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 está listo para continuar.

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

1

No hay flock comando en OS X, no.Si necesita un script de shell que pueda compartir un recurso bloqueable con programas que usan la llamada al sistema flock para administrar el acceso a ese recurso, tendrá que crear dicho programa compilando el código BSD usted mismo o escribiendo su propio programa equivalente (quizás en Perl o Ruby o en algún otro idioma que expone flock como parte de su interfaz de sistema de alto nivel).

Si, sin embargo, todo lo que necesita es una forma de sincronizar el acceso a un archivo desde un shellscript, y no tiene otros programas ya escritos tratando de 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.

+0

_debe mirar el comando lockfile (viene con procmail, estándar en OS X) ._ 'lockfile: command not found' en El Capitan (10.11.6) así que no es ** no estándar **. – Sukima

+0

Gracias por la actualización, @sukima. Corregido –

8

Hay un comando rebaño multiplataforma aquí:

https://github.com/discoteq/flock

Lo he probado y funciona bien en OSX como una gota en el reemplazo para el rebaño util-linux.

+0

¿Cómo es que el reclamo tiene éxito, pero realmente no tomar medidas (comportarse como un noop) mejor que fallar explícitamente? –

+0

Ahh - como '-x' es el predeterminado en esa implementación. De acuerdo, tiene más sentido después de leer la página del manual. :) –

+0

He presentado una solicitud de función para aceptar '-x' como no-operativo aquí - https://github.com/discoteq/flock/issues/9 – studgeek

Cuestiones relacionadas