在我的 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/