Мне нужно создать файл блокировки, который не может быть удален другими скриптами или процессами. Я попробовал это:
$f = fopen($pidFile, 'w');
fwrite($f, getmypid());
flock($f, LOCK_EX);
но любой другой процесс, запущенный от текущего пользователя, может удалить $f
файл, даже если дескриптор файла все еще открыт запущенным сценарием. Как решить эту проблему и не допустить других (т.е. не PHP-процессы тоже) от удаления файла? А блокировка будет снята автоматически при выходе из процесса? Все подобные вопросы заканчиваются RTM стая (), но никто из них не отвечает, как заблокировать файл от внешних процессов.
ОС есть Linux 2.6.32-431.el6.x86_64
flock
в Linux по умолчанию используется «консультативная блокировка», что означает, что она не препятствует каким-либо другим процессам манипулировать этим файлом. Смотрите примечание в руководстве по PHP.
flock () использует обязательную блокировку вместо рекомендательной блокировки в Windows. Обязательная блокировка также поддерживается в операционных системах на основе Linux и System V с помощью обычного механизма, поддерживаемого системным вызовом fcntl (): если в рассматриваемом файле установлен бит разрешения setgid и очищен бит выполнения группы. В Linux файловая система также должна быть смонтирована с опцией mand, чтобы это работало.
Также см https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt
Файл помечается как кандидат на обязательную блокировку путем установки бита идентификатора группы в режиме файла, но с удалением бита выполнения группы. Это иначе
бессмысленная комбинация, и была выбрана разработчиками System V, чтобы не
сломать существующие пользовательские программы.Обратите внимание, что бит идентификатора группы обычно автоматически очищается ядром, когда
файл setgid записывается в. Это мера безопасности. Ядро было
изменен, чтобы распознать специальный случай кандидата обязательной блокировки и
воздерживаться от очистки этого бита. Точно так же ядро было модифицировано не
запускать обязательную блокировку кандидатов с привилегиями setgid.
Также учтите предупреждение:
Даже root не может переопределить обязательную блокировку, поэтому запущенные процессы могут нарушить работу
хаос, если они блокируют важные файлы. Обойти это, чтобы изменить файл
разрешения (удалите бит setgid), прежде чем пытаться читать или писать в него.
Других решений пока нет …