flock

Locking auf der Bash

Written by  on November 29, 2014

Dies ist eine aktualisierte Version von Locking auf der Bash vom  19. Mai 2012. Flock für File Locking zu benutzen hat sich seitdem leicht verändert.

Dazu ein neues Testscript test.sh:

#!/bin/bash
echo start
sleep 20
echo end

Der Aufruf lautet jetzt

flock -w1 -x ./test.lock ./test.sh

Das Lockfile wird neu angelegt. Es ist nicht mehr möglich das Scriptfile selber auch als Lockfile zu benutzen. Versucht man es doch führt das zur Fehlermeldung

# flock -w1 -x ./test.sh ./test.sh
flock: ./test.sh: Text file busy

Jetzt zwei Mal das Script starten – wegen dem Timeout mit -w1 läuft es nur ein Mal

$ flock -w1 -x ./test.lock ./test.sh &
[1] 19423
$ start
flock -w1 -x ./test.lock ./test.sh &
[2] 19426
$ jobs
[1]- Running flock -w1 -x ./test.lock ./test.sh &
[2]+ Exit 1 flock -w1 -x ./test.lock ./test.sh
$ end
[1]+ Done flock -w1 -x ./test.lock ./test.sh

 

Bücher zur Shell Programmierung bei Amazon

Locking auf der Bash

Written by  on Mai 19, 2012

Da ich es mit meiner Erklärung sogar ins Linux Magazin zu den Leserbriefen geschafft habe, schreibe ich hier auch noch ein paar Worte zum Locking in Shell-Scripten.

Mit dem Tool "flock" lässt sich in Shell-Scripten ein ganz einfaches Locking realisieren. Und zwar ohne, dass man sich um ein eigenes Lock-File bzw. um das entfernen des Selbingen kümmern muss.

Günstig ist z.B. wenn es bereits ein Backup-Script gibt:

server:~/tmp # time ./backup.sh
mache backup - irgendwas mit rsync
fertig

real    0m5.033s
user    0m0.004s
sys     0m0.004s

Jetzt möchte ich einen Locking-Mechanismus haben, der verhindert, dass das Script 2x gleichzeitg läuft:

flock -w1 -x ./backup.sh ./backup.sh

Das führt dazu, dass ein Kernel-Lock angefordert wird, der eindeutig ist, weil er sich auf das Script bezieht.

Was soll jetzt geschehen, wenn der Lock nicht erfolgreich war? Mit dem Parameter w wurde ein Timeout mitgegeben. D.h. nach einer Sekunde wird abgebrochen. Wie bekomme ich mit, dass das Script gar nicht gelaufen ist?

flock -w1 -x ./backup.sh ./backup.sh || echo es gab ein problem

Ich lasse es mir einfach ausgeben… oder per Mail schicken. Aber das soll ruhig eine Übung für den Leser bleiben.