Открытие файла не является блокировкой, потому что если каждый процесс сначала должен проверить, открыт ли файл, а если нет, то два процесса вполне могут проверить одновременно, оба обнаруживают, что файл не открыт, затем оба создают или открывают его.
Чтобы использовать файл в качестве блокировки, операция проверки и блокировки должна быть одной непрерывной операцией. Этого можно добиться в файловой системе 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$'