Відкриття файлу не є блокуванням, оскільки, якщо кожен процес повинен перевірити, чи файл відкритий першим і не продовжувати, якщо він є, або створити / відкрити його, якщо він не є, то два процеси можуть цілком перевірити одночасно, обидва знаходять що він не відкритий, то і створити або відкрити його.
Щоб використовувати файл як блокування, операція перевірки та блокування повинна бути однією операцією безперервної дії. Цього можна досягти у файловій системі Unix, створивши файл з режимом лише для читання та видаливши його для розблокування. Якщо файл існує (і є лише читанням), створення файлу не вдасться, тому ви отримуєте перевірку та блокування в одній атомній операції.
Якщо процес блокування - це сценарій оболонки, який буде працювати як демон, цей ефект можна отримати за допомогою umask
, налаштування кожного процесу, що встановлює дозволи, які створюються новими файлами за допомогою:
oldumask=$(umask)
umask 222 # create files unwritable to owner too
if echo $$ > /var/lock/foo
then
: locking succeeded
else
: locking failed
fi
umask $oldumask
Це також записує PID процесу власності у файл, що вирішує вашу іншу проблему:
cat /var/lock/foo
Що стосується конкретного питання "Які процеси мають цей файл відкритим?", Це може бути корисним, коли ви хочете відмовитися від файлової системи, але не можете, тому що якийсь процес має відкритий файл у ньому. Якщо у вас немає таких доступних команд, ви можете запитати
/proc
як корінь:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
або, як смертельний користувач:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'