Memiliki file yang terbuka bukanlah kunci karena, jika setiap proses harus memeriksa apakah file tersebut dibuka terlebih dahulu dan tidak melanjutkan jika itu adalah file atau membuat / membukanya jika tidak, maka dua proses dapat memeriksa dengan baik secara bersamaan, keduanya menemukan bahwa itu tidak terbuka, maka keduanya membuat atau membukanya.
Untuk menggunakan file sebagai kunci, operasi pemeriksaan dan penguncian harus merupakan operasi tunggal yang tidak terputus. Anda dapat mencapai ini dalam sistem file Unix dengan membuat file dengan mode hanya baca dan menghapusnya untuk membuka kunci. Jika file itu ada (dan hanya baca) pembuatan file akan gagal, sehingga Anda mendapatkan check-and-lock dalam satu operasi atom.
Jika proses penguncian Anda adalah skrip shell yang akan berjalan sebagai daemon, Anda bisa mendapatkan efek ini dengan menggunakan umask
, pengaturan per-proses yang menetapkan izin yang membuat file baru dengan:
oldumask = $ (umask)
umask 222 # buat file juga tidak bisa ditulis oleh pemilik
jika echo $$> / var / lock / foo
kemudian
: penguncian berhasil
lain
: penguncian gagal
fi
umask $ oldumask
Ini juga menulis proses kepemilikan 'PID ke dalam file, yang memecahkan masalah Anda yang lain:
cat /var/lock/foo
Mengenai pertanyaan spesifik "Proses mana yang membuka file ini?", Ini bisa berguna ketika Anda ingin meng-unmount sistem file tetapi tidak bisa karena beberapa proses memiliki file yang terbuka di dalamnya. Jika Anda tidak memiliki perintah-perintah itu, Anda dapat bertanya
/proc
sebagai root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
atau, sebagai pengguna manusia:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'