在我的Linux服务器上,我有两个Linux用户:
Jim—维护其他用户使用的中心框架存储库,包括一些第三方开源库,如Jobby
Rob-使用Jim维护的框架来完成特定的工作。
jobby是一个php cron管理脚本,它为每个已启动的作业/进程在/tmp/xxxxx.lck创建一个锁文件。
在rob进来之前,jim曾经做过所有的事情,包括中心框架和具体的工作。因此cron脚本将作为jim运行,锁文件将由jim创建和拥有,因此脚本读取锁文件没有问题。
然而,当rob进来接管具体工作时,rob的cron脚本运行为rob,它调用jim拥有的jobby库。因此,锁文件由jim创建和拥有。现在rob编写的cron脚本无法读取jim创建的锁文件,并一直给出jobby错误:
错误:无法打开文件(file:/tmp/xxxx.lck)。
基本上,脚本a(rob)调用创建/tmp/xxxx.lck(-rw-r--r--1 jim jim)的脚本b(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进来之前创建的。
所以我只需要删除文件/tmp/xxxx.lck作为jim。现在,当rob运行他的脚本时,将创建与rob相同的锁文件,一切都会恢复正常。

10-08 19:44