PHP 读取由不同的 Linux 用户创建的锁定文件?

标签 php linux permissions locking

在我的 Linux 服务器上,我有 2 个 Linux 用户:

  • Jim - 维护其他用户使用的中央框架存储库,包括一些第 3 方开源库,例如 Jobby .
  • Rob - 使用 Jim 维护的框架来完成特定工作。

Jobby 是一个 PHP cron 管理脚本,它在/tmp/xxxxx.lck 为每个已启动的作业/进程创建一个锁定文件。

Rob 进来之前,Jim 曾经负责所有工作,包括中央框架和具体工作。因此,cron 脚本将作为 Jim 运行,锁定文件将由 Jim 创建并拥有,因此脚本读取锁定文件没有问题。

但是,当 Rob 进来并接管具体工作时, Rob 的 cron 脚本作为 Rob 运行,调用 Jobby Jim 拥有的图书馆。锁文件因此由 Jim 创建并拥有。现在 Rob 的 cron 脚本无法读取 Jim 创建的锁定文件并不断给出 Jobby 错误:

ERROR: Unable to open file (File: /tmp/xxxx.lck).

基本上,脚本 A (Rob) 调用脚本 B (Jim) 创建/tmp/xxxx.lck (-rw-r--r-- 1 Jim Jim),有没有什么安全的方法可以让脚本 A (Rob) 能够读取/tmp/xxxx.lck?

但是权限 (-rw-r--r--) 不是很好,因为它允许任何人读取文件吗?这真的很奇怪。

那为什么 Jobby 报错呢?

更新

当我写这个问题时,我想到我应该首先找出 Jobby 抛出这个错误的原因。我发现了这个:

public function acquireLock($lockfile)
{
    if (array_key_exists($lockfile, $this->lockHandles)) {
        throw new Exception("Lock already acquired (Lockfile: $lockfile).");
    }

    if (!file_exists($lockfile) && !touch($lockfile)) {
        throw new Exception("Unable to create file (File: $lockfile).");
    }

    $fh = fopen($lockfile, "r+");
    if ($fh === false) {
        throw new Exception("Unable to open file (File: $lockfile).");
    }

    $attempts = 5;
    while ($attempts > 0) {
        if (flock($fh, LOCK_EX | LOCK_NB)) {
            $this->lockHandles[$lockfile] = $fh;
            ftruncate($fh, 0);
            fwrite($fh, getmypid());
            return;
        }
        usleep(250);
        --$attempts;
    }

    throw new InfoException("Job is still locked (Lockfile: $lockfile)!");
}

所以它要求锁文件的读和写权限。

由于锁定文件是 (-rw-r--r-- 1 Jim Jim) Rob 的脚本将无法写入它 --- 我想这就是问题所在?

但为什么 Jobby 以 Jim 的身份创建文件,却以 Rob 的身份打开文件?

有什么方法可以让我以 Rob 的身份创建 然后打开 文件?

最佳答案

这很尴尬。似乎/tmp/xxxx.lck 最初是由 Jim 在 Rob 进来之前创建的。

所以我只需要以 Jim 的身份删除文件/tmp/xxxx.lck。现在,当 Rob 运行他的脚本时,将创建与 Rob 相同的锁定文件,然后一切都恢复正常。

关于PHP 读取由不同的 Linux 用户创建的锁定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35032273/

相关文章:

linux - LD_PRELOAD 栈和数据段内存分配

linux - 如何在 Linux 后台无限运行脚本?

php-chmod() : No such file or directory

php - 解析错误 : syntax error, 意外\'?>\',期望函数 (T_FUNCTION)

php - Wp-插入不工作

javascript - 如何使用 JavaScript/jQuery 编辑 PHP 变量?

php - 在沙盒模式下运行 PHP、Ruby 或 Python 进程

android - Redmi 手机不询问短信权限,因此不阅读短信

android - 在 Android 5 上使用 MediaController

php - 存储信息故障