【发布时间】:2012-10-27 10:20:07
【问题描述】:
在我的 Linux 服务器上,我需要同步多个用 BASH 和 PHP 编写的脚本,以便只有其中一个能够启动系统关键工作,即一系列 BASH/PHP 命令,这会造成混乱如果由两个或多个脚本同时执行,事情就会发生。根据我在 C++ 中使用多线程的经验,我熟悉互斥锁的概念,但是如何为在不同进程中运行并且当然不是用 C++ 编写的一堆脚本实现互斥锁呢?
嗯,想到的第一个解决方案是确保每个脚本最初都创建一个“锁定标志”文件,让其他脚本知道该作业已“锁定”,然后在完成后删除该文件工作。但是,正如我所见,文件写入 和 读取操作需要完全原子 才能让这种方法以 100% 的概率起作用,并且相同的要求将适用于任何其他同步方法。而且我很确定文件写入/读取操作不是原子的,它们至少在所有现有的 Linux/Unix 系统中都不是原子的。
那么同步并发 BASH 和 PHP 脚本最灵活可靠的方法是什么?
【问题讨论】:
-
我不确定互斥锁将如何帮助您。如果是我,我会简单地依赖锁或 pid 文件 - 即将关键作业的 pid 保存到文件中。在下一次运行任一脚本时,请执行
if(process_exists(readfile(pidfile)))exit;之类的操作 -
@Christian 好吧,由于
process_exists和readfile(和writefile)缺乏原子性,并且由于它们没有作为一个原子调用粘合在一起,在我看来,您建议的逻辑仍然会为多个脚本同时开始执行关键代码行的机会留下一个小窗口。 -
你应该使用 LockFile/flock(我认为)。守护程序脚本 (
/init.id/*) 通常这样做......所以他们不太可能做错了。 -
@Christian 你是说
/etc/init.d/中的脚本吗?无论如何,他们没有给出任何 PHP 示例。 -
我很抱歉,这是正确的。我认为这些脚本对您的事业很有用,因为您可以尝试查找 bash 代码的 PHP 等效项。嗯,相关系统命令的PHP移植......
标签: php linux shell concurrency