Übergeben Sie mehrere Befehle an die Herde

11
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Wie würde ich mehrere Befehle flockwie im obigen Beispiel übergeben?

Soweit ich weiß, werden flockverschiedene Flags verwendet (-x für exklusiv, -w für Timeout), dann die zu sperrende Datei und dann der auszuführende Befehl. Ich bin nicht sicher, wie ich zwei Befehle an diese Funktion übergeben würde (Variable mit dem Inhalt der gesperrten Datei festlegen und diese Datei dann inkrementieren).

Mein Ziel hier ist es, ein etwas atomares Inkrement für eine Datei zu erstellen, indem es jedes Mal gesperrt wird, wenn ein Skript versucht, auf die counter.txtDatei zuzugreifen .

d -_- b
quelle

Antworten:

7

Rufen Sie eine Shell explizit auf.

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Beachten Sie, dass jede Variable, die Sie ändern, lokal für diese Shell-Instanz ist. Beispielsweise wird die COUNTERVariable im aufrufenden Skript nicht aktualisiert: Sie müssen sie aus der Datei zurücklesen (sie hat sich jedoch möglicherweise in der Zwischenzeit geändert) oder als Ausgabe des Befehls:

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')
Gilles 'SO - hör auf böse zu sein'
quelle
Super, vielen Dank! Die Erklärung, die Sie uns gegeben haben, hat mich definitiv vor einer weiteren Stunde Kopfschmerzen
bewahrt
4

Oder Sie können einen Dateideskriptor beflocken

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

Dies hat auch den Vorteil, dass Sie die Zählervariable im Gegensatz zu Subshell-basierten Ansätzen direkt verwenden können.

Richard Maw
quelle
Bitte würden Sie das erklären exec {counterfd}? Allein Debian-Fehler not found, aber es gibt 0 mit der Umleitung zurück. Sehr komisch.
Steve Almond
2

Das flockTool ist etwas schwierig zu bedienen und die Manpage ist ziemlich kurz. Die Manpage bietet drei Möglichkeiten, das Tool zu verwenden:

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

Die Art und Weise, wie diese Frage formuliert ist, würde ich definitiv die dritte Form von verwenden flock. Wenn Sie weiter unten in der Manpage flocknachsehen, finden Sie einige Beispiele, die die genaue Syntax für die Verwendung der dritten Form zeigen:

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

Ich habe das hinzugefügt #!/bin/bash.

Ich habe diese Form von erfolgreich verwendet flock.

Trevor Boyd Smith
quelle