Apakah flock & exec aman di bash?

13

Cuplikan penguncian "standar" yang saya lihat berjalan seperti ...

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

Apakah aman (pengujian tampaknya mengatakan demikian) untuk digunakan execpada saat itu? Apakah subproses akan mempertahankan kunci?

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

Saya samar-samar ingat proses exec'd mempertahankan deskriptor file terbuka dan karena kawanan menggunakan deskriptor file itu harus berfungsi. Tetapi saya tidak dapat menemukan dokumentasi yang membuatnya jelas dan jelas.

Sebagai catatan, ini khusus untuk Linux.

Danny
sumber

Jawaban:

3

Ya, kunci dijaga agar tetap melintang exec. Kunci disimpan di seluruh panggilan sistem yang mendasarinya execve, selama deskriptor file tetap terbuka. Deskriptor file tetap terbuka execvekecuali jika telah dikonfigurasi untuk ditutup pada exec, dan deskriptor file yang dibuat oleh pengalihan shell tidak ditandai sebagai close-on-exec.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6

Ya itu. Exec hanya mengganti gambar proses, tetapi masih proses yang sama sehingga kunci tingkat OS yang terkait dengannya tetap sama.

Sangat mudah untuk memverifikasi bahwa itu berfungsi:

mengunci

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

naskah

sleep 100

Coba jalankan ./lockdua kali dalam 100 detik berikutnya. Anda hanya akan mendapatkan kunci sekali, ergo exectidak melepaskan kunci.

PSkocik
sumber