当前位置: 首页 > 知识库问答 >
问题:

如何针对外部进程锁定文件

东郭存
2023-03-14

我需要创建一个锁文件,不能被其他脚本或进程删除。我试过这个:

    $f = fopen($pidFile, 'w');
    fwrite($f, getmypid());
    flock($f, LOCK_EX);

但是,从当前用户启动的任何其他进程都可以删除$f文件,即使文件句柄仍然由正在运行的脚本打开。如何解决此问题并防止其他人(即非PHP进程)删除该文件?进程退出时自动释放的锁?所有类似的问题都以RTM flock()结尾,但没有一个回答如何针对外部进程锁定文件。

OS是Linux2.6.32-431.el6.x86_64

共有1个答案

岳凯康
2023-03-14

默认情况下,Linux上的flock使用“建议锁定”,这意味着它不会阻止任何其他进程操作该文件。请参阅PHP手册中的注释。

flock()在Windows上使用强制锁定而不是建议锁定。通过fcntl()系统调用支持的常用机制,Linux和基于System V的操作系统也支持强制锁定:即,如果所讨论的文件设置了setgid权限位,并且清除了组执行位。在Linux上,文件系统还需要安装mand选项才能正常工作。

也看到https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

通过在文件模式中设置group id位,但删除group执行位,将文件标记为强制锁定的候选。这是一个毫无意义的组合,是由System V实现者选择的,以免破坏现有的用户程序。

注意,当setgid文件被写入时,组id位通常由内核自动清除。这是一项安全措施。内核已被修改,以识别强制锁候选的特殊情况,并避免清除该位。同样,内核也被修改为不运行具有setgid权限的强制候选锁。

还要记住警告:

即使root也无法覆盖强制锁,因此失控进程如果锁定关键文件,可能会造成严重破坏。解决方法是在尝试读取或写入文件之前更改文件权限(删除setgid位)。

 类似资料:
  • 我正在尝试调整图像的大小。首先,我将图像读入字节数组,在内存中调整大小并将其写回同一个文件: 但是,通常会出现以下错误: 进程无法访问文件:'C:\folder\image.jpg',因为它正被另一个进程使用。 为什么会这样?我会假设File. ReadAllBytes()会自动关闭文件? 进程资源管理器中没有显示文件句柄或锁(这似乎很奇怪)。 即使我在while循环中添加了一些延迟,循环也永远不

  • 问题内容: UNIX文件锁定非常简单:操作系统假定您知道自己在做什么,然后就可以按照自己的意愿进行操作: 例如,如果您尝试删除另一个进程已打开的文件,则操作系统通常会允许您执行此操作。原始进程仍将保留其文件句柄,直到它终止-这时文件系统将安静地回收磁盘资源。不用大惊小怪,这就是我喜欢的方式。 Windows上的不同之处:如果我尝试删除另一个进程正在使用的文件,则会出现操作系统错误。在原始进程释放它

  • 问题内容: 以下函数在其自己的线程中执行: 当执行到达该行时,将引发异常: 有谁知道如何锁定对象或函数以防止并发?我试图添加一个Lock对象: 和线 在功能开始时,但是没有用。 问题答案: 为了在一个对象上调用wait(),您必须在该对象上持有同步锁(尽管该锁实际上是在线程等待时释放的): 我必须承认,在这种情况下, 为什么 您要这样做让我感到困惑…

  • 存储区及其锁文件已被另一个进程锁定:/home/dev/neo4j-community-2.3.2/data/graph.db/store_lock。请确保没有其他进程正在使用此数据库,并且目录是可写的(即使是只读访问也是必需的) 我知道这是因为neo4j服务器应用程序正在运行,它将目录锁定为另一个应用程序的可写目录。 但是我想同时运行这两个功能,neo4j服务器与browser studio和我

  • 我有许多swagger文件,使用相同的定义。我想将此定义移动到单独的文件并引用它们。 主 swagger 文件如下所示: 我尝试导入的文件已保存到 exceptions.yaml(并保存到同一位置),如下所示: 我读过$refhttps://swagger.io/docs/specification/using-ref/但找不到如何导入定义,而不是API 我正在尝试导入它,并做了以下更改: 或者使

  • 本文向大家介绍PHP对文件进行加锁、解锁实例,包括了PHP对文件进行加锁、解锁实例的使用技巧和注意事项,需要的朋友参考一下 有时候你的php脚本或许需要线程安全的保证,比如进行文件写操作的时候。本文提供了文件加锁函数以及使用示例。文件加锁功能也可以用来获得独享的处理空间,防止脚本执行发生同步错误。