2012-05-10 8 views

Antwort

2

Ich glaube nicht, dass der flock Befehl auf OS X existiert, aber es auf BSD existiert, die es relativ einfach in den Hafen OS X.

Die nächstgelegene, die zur Verfügung stellen sollten, ist, ist der shlock Befehl (man page), aber es ist nicht so robust oder sicher wie flock.

Ihre beste Wette kann bei der Portierung entweder die Linux oder BSD-Version von flock auf OS X.

1

Sind Sie für flock das Befehlszeilenprogramm oder flock das Feature suchen suchen sein?

flock(1) ist unter OS X nicht verfügbar. flock(2) (die C-Funktion zum Sperren von Dateien), however is.

Schreiben einer einfachen Befehlszeile flock(1) Dienstprogramm mit flock(2) sollte trivial sein.

-5

Sie können einen Shell-Level Flock (1) Befehl für die Shell-Programmierung nicht schreiben, weil Dateisperrung funktioniert. Die Sperre befindet sich auf dem Deskriptor, nicht auf dem Inode- oder Verzeichniseintrag.

Deshalb, wenn Sie einen Shell-Befehl implementieren, die etwas, sobald die Sperr Befehl beendet und der Shell-Skript bewegt sich auf den nächsten Befehl Herden, die Beschreiber, der die Sperre verschwindet und so gibt es keine Sperre erhalten.

Der einzige Weg, dies zu implementieren als Shell-builtin wäre. Alternativ müssen Sie in einer Programmiersprache, die tatsächlich Flock (2) unterstützt direkt umschreiben, wie Perl.

+0

Linux [flock (1)] (http://linux.die.net/man/1/flock) ist kein trivialer Wrapper um Flock (2). – Gilles

+0

Verstehe ich es richtig? Die Sperre wird nur so lange beibehalten, wie der Prozess ausgeführt wird. So würde eine einfache Hülle um Herde (2) das Schloss nur ein wenig halten, während es läuft. In einem Skript würde die Sperre freigegeben werden, bevor der nächste Befehl aufgerufen wird, oder? – jboi

+2

@jboi - der flock (1) -Befehl nimmt entweder einen Shell-Befehl (der ausgeführt wird, während die Sperre gehalten wird) oder die Nummer eines Dateideskriptors, der gesperrt werden soll - im letzteren Fall wird der Dateideskriptor im Aufrufer geöffnet (wenn Es ist ein Shell-Skript, das '' exec 9> $ LOCKFILE'' oder ähnliches verwendet und nach dem Beenden des Befehls flock geöffnet bleibt. Was die Behauptung von @tchrist anbelangt, dass du keine Shell-Level-Herde schreiben kannst - nun, ich würde (fast) alles glauben, was er über Perl sagt, aber in dieser Hinsicht liegt er falsch. Der Befehl flock führt die gesperrten Befehle aus (wenn ein Dateiname übergeben wurde) oder eine Datei-Deskriptor-Nummer übergeben wird - es funktioniert! –

10

Perl Einzeiler:

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

Als Skript:

#!/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 In Zukunft sollten Sie wahrscheinlich keine Codeänderungen an der Antwort eines anderen vornehmen. Fühlen Sie sich frei, Ihre vorgeschlagene Bearbeitung als Kommentar einzureichen und lassen Sie den Autor anrufen, ob er oder sie ihre Antwort ändern möchte oder nicht (9 von 10, wenn es ein Fehler ist, werden sie es beheben). Fühlen Sie sich frei, Antworten für wesentliche Änderungen für Klarheit oder Formatierung zu redigieren, aber ändern Sie nicht die Antwort selbst. – Rob

+1

Beachten Sie, dass diese Perl-Emulation sehr unvollständig ist - sie unterstützt nur die Form '' flock FILE COMMANDS ... '' und nicht die '' flock FD'' Form (auch keine der flock (1) Optionen). –

1

Nur der Vollständigkeit halber willen, können Sie Herde (2) für OSX mit einigen geringfügigen Änderungen kompilieren, ich habe keine Tests ausführen, aber grundlegende Funktionalität funktioniert.

Sie können die Quelle von ftp://ftp.kernel.org//pub/linux/utils/util-linux zu bekommen. Sie müssen dann einige Aufrufe für Zeichenfolgenfunktionen ersetzen, die auf OSX nicht verfügbar sind, und Sie können loslegen.

hier: https://gist.github.com/Ahti/4962822 ist meine modifizierte flock.c der Version 2.22.1, Sie immer noch, obwohl die anderen Quellen für Header-Dateien benötigt.

1

Es gibt keine flock Befehl auf OS X, Nr.Wenn Sie ein Shell-Skript benötigen, das eine sperrbare Ressource für Programme freigeben kann, die den Systemzugriff flock verwenden, müssen Sie ein solches Programm erstellen - indem Sie die BSD-Quelle selbst kompilieren oder ein eigenes gleichwertiges Programm schreiben (vielleicht in Perl oder Ruby oder einer anderen Sprache, die flock als Teil ihrer übergeordneten Systemschnittstelle freigibt.

Wenn Sie jedoch nur eine Möglichkeit zum Synchronisieren des Zugriffs auf eine Datei aus einem Shellskript benötigen und keine anderen Programme bereits mit flock geschrieben haben, können Sie den Befehl lockfile verwenden mit dem procmail Paket. OS X verwendet, um mit zu versenden; es nicht mehr, aber Sie können es über z. Homebrew.

+0

_Sie sollten sich den Befehl lockfile anschauen (kommt mit procmail, Standard auf OS X) ._ 'lockfile: Befehl nicht gefunden 'auf El Capitan (10.11.6) also nein es ist ** nicht Standard **. – Sukima

+0

Danke für das Update, @sukima. Korrigiert. –

8

Es ist eine plattformübergreifende Herde Befehl hier:

https://github.com/discoteq/flock

ich es getestet und es funktioniert gut auf OSX als Drop-in-Ersatz für die util-linux Herde.

+0

Wie behauptet man, erfolgreich zu sein, aber tatsächlich nicht aktiv zu werden (sich wie ein Noop zu verhalten), als explizit zu versagen? –

+0

Ahh - wie '-x' ist Standard in dieser Implementierung. Okay, macht mehr Sinn, die Manpage gelesen zu haben. :) –

+0

Ich reichte eine Feature-Anfrage ein, um '-x' als No-Op hier zu akzeptieren - https://github.com/discoteq/flock/issues/9 – studgeek