Habe ich es getestet und es funktioniert auch auf OSX als drop-in Ersatz für das util-linux-Herde.
Wie ist zu fordern, um erfolgreich zu sein, aber tatsächlich scheitern, Maßnahmen zu ergreifen (verhält sich wie eine noop) besser als scheitern explizit?
Ahh -- als -x ist Standard in der Umsetzung. Okay, macht mehr Sinn nach dem Lesen der man-Seite. 🙂
#!/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);
In der Zukunft, Sie sollten wahrscheinlich nicht den code ändern, um jemand anderes beantworten. Fühlen Sie sich frei, um senden Sie Ihre vorgeschlagen editieren, um einen Kommentar und lassen Sie uns den Autor, den Anruf machen, ob er oder Sie will, zu ändern, Ihre Antwort oder nicht (9 mal out of 10, wenn es ein Fehler, Sie ' ll fix it). Fühlen Sie sich frei zu Bearbeiten Antworten für erhebliche änderungen für die Klarheit oder die Formatierung, ändern jedoch nicht die Antwort selbst.
Beachten Sie, dass dieses Perl-emulation ist sehr unvollständig - es unterstützt nur die form flock FILE COMMANDS... und nicht die flock FD form (weder unterstützt es alle in der Herde(1) - Optionen).
Gibt es keine flock Befehl auf OS X, Nein. Wenn Sie ein shell-Skript, können Sie teilen sich eine abschließbare Ressource mit den Programmen, die mit der flock system rufen Sie, um zu verwalten, den Zugriff auf die Ressource, die Sie erstellen müssen, die ein solches Programm durch kompilieren des BSD Quelle selbst, oder schreiben Sie Ihre eigenen entsprechenden Programm (vielleicht in Perl oder Ruby oder eine andere Sprache, das macht flock als Teil seiner high-level-system-Schnittstelle).
Wenn, jedoch, alles, was Sie brauchen, ist ein Weg zur Synchronisation des Zugriffs auf eine Datei aus einem shellscript, und Sie habe keine anderen Programme schon geschrieben, versucht dies mit flock werden, könnte die lockfile Befehl, kommt das mit den procmail Paket. OS X verwendet werden, um Schiff mit procmail; es nicht mehr, aber man kann es installieren, z.B. über Homebrew.
Sie sollten sich auf die lockfile-Befehl (kommt mit procmail, standard auf OS X). lockfile: command not found am El Capitan (10.11.6) also Nein es ist nicht standard.
Sind Sie auf der Suche nach flock das Befehlszeilen-Dienstprogramm oder flock das feature?
flock(1) ist nicht verfügbar auf OS X. flock(2) (die C-Funktion für die Datei zu sperren), jedoch ist.
Schreiben Sie eine einfache Befehlszeile flock(1) - Dienstprogramm mithilfe flock(2) sollte trivial sein.
"Schreiben Sie eine einfache Befehlszeile Herde(1) Programm, unter Verwendung von flock(2) sollte trivial sein." so trivial, dass Sie freundlich genug, zu teilen, eines für die nicht-C-dev gibt? ?
Einfach der Vollständigkeit halber, können Sie sich zusammenstellen, flock(2) für OSX, mit einigen kleinen änderungen, ich habe nicht irgendwelche tests, sondern um einfache Funktionalität funktioniert.
Können Sie die Quelle von ftp://ftp.kernel.org//pub/linux/utils/util-linux. Sie müssen dann ersetzen einige Aufrufe von string-Funktionen sind nicht verfügbar unter OSX, und du bist gut zu gehen.
Können Sie nicht schreiben Sie ein shell-Ebene Herde(1) - Befehl ist für die Verwendung in shell-Programmierung, weil, wie die Datei Verriegelung arbeitet. Die Sperre ist auf den Deskriptor, nicht auf der inode-oder Verzeichnis-Eintrag.
Deshalb wenn Sie bei der Implementierung einer shell-Befehl, der Herden etwas, sobald der schließ-Befehl beendet wird und das shell-Skript bewegt sich auf den nächsten Befehl, den Deskriptor, statt die Sperre verschwindet und so gibt es auch keine Sperre erhalten.
Die einzige Möglichkeit dies umzusetzen wäre als ein shell-builtin. Abwechselnd, Sie neu zu schreiben in einer Programmiersprache, die eigentlich unterstützt Herde(2) direkt, so wie bei Perl.
Linux ist flock(1) ist keine triviale wrapper flock(2).
Verstehe ich es richtig? Der lock ist nur so lange aufbewahrt, wie der Prozess ausgeführt wird. So, ein einfacher wrapper um flock(2) halten würde, das Schloss nur ein slong, wie es läuft. In einem Skript die Sperre freigegeben werden, bevor der nächste Befehl aufgerufen wird, richtig?
die Herde(1) - Befehl entweder übernimmt ein shell-Befehl (der ausgeführt wird, während die Sperre) oder die Nummer eines file-Deskriptor, die gesperrt werden soll - in diesem Fall der Datei-Deskriptor wird geöffnet, in dem Anrufer (wenn es ein shell-Skript, mit exec 9>$LOCKFILE oder ähnlich) und bleibt geöffnet, nachdem der flock-Befehl beendet wird. Für @tchrist behaupten, dass Sie nicht schreiben Sie ein shell-Ebene mit flock - gut, würde ich glauben, (fast) alles, was er sagt über Perl, aber er ist falsch. Der flock-Befehl läuft der gesperrten Befehle (wenn übergeben Sie einen Dateinamen) oder übergeben Sie einen Datei-Deskriptor-Nummer - es funktioniert!
ist das nicht ein shell-builtin sogar auf Linux, so ist dies natürlich falsch. Vielmehr ist das anbringen einer Sperre, um eine Datei-Deskriptor gilt, dass die FD auch über Verfahren, so ist es in der Lage, zum ändern der übergeordneten Instanz als gut.
Es ist ein cross-Plattform-flock Befehl hier:
https://github.com/discoteq/flock
Habe ich es getestet und es funktioniert auch auf OSX als drop-in Ersatz für das util-linux-Herde.
-x
ist Standard in der Umsetzung. Okay, macht mehr Sinn nach dem Lesen der man-Seite. 🙂-x
als nicht-op hier - github.com/discoteq/flock/issues/9-x
Flagge sowie long-Optionen.Perl-one-liner:
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:
flock FILE COMMANDS...
und nicht dieflock FD
form (weder unterstützt es alle in der Herde(1) - Optionen).Ich glaube nicht, dass die
flock
Befehl existiert auf OS X, aber es gibt Sie auf BSD sollte es relativ einfache Portierung auf OS X.Den nächsten, die vorhanden ist, ist die
shlock
Befehl (Mann Seite), aber es ist nicht so stabil und sicher wieflock
.Ihre beste Wette sein kann, um zu schauen, Portierung entweder das Linux-oder BSD-version von
flock
zu OS X.Vielleicht
lockfile
könnte auch verwendet werden.http://linux.die.net/man/1/lockfile
Gibt es keine
flock
Befehl auf OS X, Nein. Wenn Sie ein shell-Skript, können Sie teilen sich eine abschließbare Ressource mit den Programmen, die mit derflock
system rufen Sie, um zu verwalten, den Zugriff auf die Ressource, die Sie erstellen müssen, die ein solches Programm durch kompilieren des BSD Quelle selbst, oder schreiben Sie Ihre eigenen entsprechenden Programm (vielleicht in Perl oder Ruby oder eine andere Sprache, das machtflock
als Teil seiner high-level-system-Schnittstelle).Wenn, jedoch, alles, was Sie brauchen, ist ein Weg zur Synchronisation des Zugriffs auf eine Datei aus einem shellscript, und Sie habe keine anderen Programme schon geschrieben, versucht dies mit
flock
werden, könnte dielockfile
Befehl, kommt das mit denprocmail
Paket. OS X verwendet werden, um Schiff mitprocmail
; es nicht mehr, aber man kann es installieren, z.B. über Homebrew.lockfile: command not found
am El Capitan (10.11.6) also Nein es ist nicht standard.Sind Sie auf der Suche nach
flock
das Befehlszeilen-Dienstprogramm oderflock
das feature?flock(1)
ist nicht verfügbar auf OS X.flock(2)
(die C-Funktion für die Datei zu sperren), jedoch ist.Schreiben Sie eine einfache Befehlszeile
flock(1)
- Dienstprogramm mithilfeflock(2)
sollte trivial sein.Einfach der Vollständigkeit halber, können Sie sich zusammenstellen, flock(2) für OSX, mit einigen kleinen änderungen, ich habe nicht irgendwelche tests, sondern um einfache Funktionalität funktioniert.
Können Sie die Quelle von ftp://ftp.kernel.org//pub/linux/utils/util-linux. Sie müssen dann ersetzen einige Aufrufe von string-Funktionen sind nicht verfügbar unter OSX, und du bist gut zu gehen.
Hier: https://gist.github.com/Ahti/4962822 ist meine veränderte Herde.c-version 2.22.1, müssen Sie noch weitere Quellen für Kopf-obwohl.
Können Sie nicht schreiben Sie ein shell-Ebene Herde(1) - Befehl ist für die Verwendung in shell-Programmierung, weil, wie die Datei Verriegelung arbeitet. Die Sperre ist auf den Deskriptor, nicht auf der inode-oder Verzeichnis-Eintrag.
Deshalb wenn Sie bei der Implementierung einer shell-Befehl, der Herden etwas, sobald der schließ-Befehl beendet wird und das shell-Skript bewegt sich auf den nächsten Befehl, den Deskriptor, statt die Sperre verschwindet und so gibt es auch keine Sperre erhalten.
Die einzige Möglichkeit dies umzusetzen wäre als ein shell-builtin. Abwechselnd, Sie neu zu schreiben in einer Programmiersprache, die eigentlich unterstützt Herde(2) direkt, so wie bei Perl.
exec 9>$LOCKFILE
oder ähnlich) und bleibt geöffnet, nachdem der flock-Befehl beendet wird. Für @tchrist behaupten, dass Sie nicht schreiben Sie ein shell-Ebene mit flock - gut, würde ich glauben, (fast) alles, was er sagt über Perl, aber er ist falsch. Der flock-Befehl läuft der gesperrten Befehle (wenn übergeben Sie einen Dateinamen) oder übergeben Sie einen Datei-Deskriptor-Nummer - es funktioniert!