我需要创建一个无法被其他脚本或进程删除的锁定文件.我试过这个:
$f = fopen($pidFile, 'w'); fwrite($f, getmypid()); flock($f, LOCK_EX);
但是,从当前用户启动的任何其他进程都可以删除该$f
文件,即使正在运行的脚本仍然打开了文件句柄.如何解决这个问题并防止其他人(即非PHP进程)删除文件?当进程退出时,锁会自动释放吗?所有类似的问题都以RTM flock()结束,但它们都没有回答如何针对外部进程锁定文件.
操作系统是 Linux 2.6.32-431.el6.x86_64
flock
在Linux上默认使用"顾问锁定",这意味着它不会阻止任何其他进程操纵该文件.请参阅PHP手册中的注释.
flock()在Windows上使用强制锁定而不是建议锁定.通过fcntl()系统调用支持的常用机制,基于Linux和System V的操作系统也支持强制锁定:即,如果相关文件设置了setgid权限位且组执行位已清除.在Linux上,还需要使用mand选项挂载文件系统,以使其正常工作.
另请参阅https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt
通过在文件模式下设置group-id位但删除group-execute位,将文件标记为强制锁定的候选者.这是一个无意义的组合,由System V实现者选择,以便不破坏现有的用户程序.
请注意,在写入setgid文件时,内核通常会自动清除group-id位.这是一项安全措施.已修改内核以识别强制锁定候选的特殊情况并避免清除此位.类似地,内核已被修改为不运行具有setgid权限的强制锁候选.
还要注意警告:
甚至根也不能覆盖强制锁定,因此如果锁定关键文件,失控进程可能会造成严重破坏.解决它的方法是在尝试读取或写入之前更改文件权限(删除setgid位).