Открытие файла не является блокировкой, потому что если каждый процесс сначала должен проверить, открыт ли файл, а если нет, то два процесса вполне могут проверить одновременно, оба обнаруживают, что файл не открыт, затем оба создают или открывают его.
Чтобы использовать файл в качестве блокировки, операция проверки и блокировки должна быть одной непрерывной операцией. Этого можно добиться в файловой системе Unix, создав файл в режиме только для чтения и удалив его для разблокировки. Если файл существует (и только для чтения), то создание файла будет неудачным, поэтому вы получаете check-and-lock за одну атомарную операцию.
Если ваш процесс блокировки является сценарием оболочки, который будет выполняться как демон, вы можете получить этот эффект, используя 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
как root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
или, как смертный пользователь:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'