Ist flock & exec sicher in bash?

13

Das "Standard" -Sperr-Snippet, das ich gesehen habe, geht ungefähr so ​​...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

Ist es sicher (Tests scheinen dies zu sagen), execan diesem Punkt zu verwenden? Behält der Unterprozess die Sperre bei?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

Ich erinnere mich vage, dass ausführbare Prozesse offene Dateideskriptoren beibehalten, und da Flock Dateideskriptoren verwendet, sollte dies funktionieren. Aber ich kann keine Dokumentation finden, die dies endgültig und klar macht.

Für den Datensatz ist dies spezifisch für Linux.

Danny
quelle

Antworten:

3

Ja, Sperren bleiben gegenüber erhalten exec. Sperren bleiben über den zugrunde liegenden Systemaufruf hinweg erhalten execve, solange der Dateideskriptor geöffnet bleibt. Dateideskriptoren bleiben offen, es execvesei denn, sie wurden so konfiguriert, dass sie bei der Ausführung geschlossen werden. Dateideskriptoren, die durch die Shell-Umleitung erstellt wurden, werden nicht als bei der Ausführung geschlossen markiert.

Gilles 'SO - hör auf böse zu sein'
quelle
6

Ja ist es. Exec ersetzt nur das Prozessabbild, aber es ist immer noch derselbe Prozess, sodass die damit verbundenen Sperren auf Betriebssystemebene gleich bleiben.

Es ist sehr einfach zu überprüfen, ob es funktioniert:

sperren

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

Skript

sleep 100

Versuchen Sie, ./lockinnerhalb der nächsten 100 Sekunden zweimal zu laufen . Sie erhalten die Sperre nur einmal, ergo exechebt die Sperre nicht auf.

PSkocik
quelle