相关疑难解决方法(0)

flock():删除没有竞争条件的锁定文件?

我正在将flock()用于进程间命名的互斥锁(即某些进程可以决定对"some_name"进行锁定,这是通过在temp目录中锁定名为"some_name"的文件来实现的:

lockfile = "/tmp/some_name.lock";
fd = open(lockfile, O_CREAT);
flock(fd, LOCK_EX);

do_something();

unlink(lockfile);
flock(fd, LOCK_UN);
Run Code Online (Sandbox Code Playgroud)

应该在某个时候删除锁定文件,以避免使用数百个文件填充临时目录.

但是,此代码中存在明显的竞争条件; 进程A,B和C的示例:

A opens file
A locks file
B opens file
A unlinks file
A unlocks file
B locks file (B holds a lock on the deleted file)
C opens file (a new file one is created)
C locks file (two processes hold the same named mutex !)
Run Code Online (Sandbox Code Playgroud)

有没有办法在某些时候删除锁定文件而不引入这种竞争条件?

c flock

21
推荐指数
2
解决办法
2万
查看次数

LOCK_NB被忽略了

运行此代码两次:

$fp = @fopen('test.test', "wb");

    if (flock($fp, LOCK_NB | LOCK_EX)){
                @fwrite($fp, $data);
                echo 'written';
                sleep(5);
    }else{
        echo 'skipped , ok';
    }

    @flock($fp, LOCK_UN);
    @fclose($fp);
Run Code Online (Sandbox Code Playgroud)

总是给我"写"的输出

意味着LOCK_NB跳过,任何线索(在winbdows和unix上)

编辑(2012-03-29仍未修复):https://bugs.php.net/bug.php?id = 54453&edit = 3 PHP Bug#54453

php flock

7
推荐指数
2
解决办法
1681
查看次数

如何防止脚本的多个实例?

我有php脚本,我必须在Linux和Windows服务器上运行.我想使用相同的脚本而不对这两个环境进行任何修改.

对于我的Windows环境,这些脚本将使用cron(在linux上)和Windows调度程序(或其他,我现在不关心)进行调度.

但是,某些脚本可能需要几分钟才能完成.我只想防止调度程序(cron或windows的一个)在上次启动它之前启动相同的脚本.

我不知道该怎么做..我想确保在执行期间出现问题时释放"锁定",所以下次没有人为干预时再次启动它.

也许有一个虚拟文件上的羊群可以做到这一点,但我不知道该怎么做.

我在这些服务器上也有一个MySQL数据库.我想可能在数据库端使用锁.

1- Start a transaction
2- Insert script name in a table.
3- execution of the script.
4- If successful then delete the row and commit the transaction or simply rollback;
Run Code Online (Sandbox Code Playgroud)

如果脚本名称在表中,那么我可以阻止它运行.如果脚本执行失败,则Mysql将自动回滚事务,以便下次调用脚本时不显示该行.

但是,在一个事务中,有没有办法让其他连接看到未提交的数据?如果有,怎么样?

如果无法使用回滚的话,我还想过在行上使用锁.

1- Insert script name in a table if it doesn't already exists.
2- Start a transaction.
2- Select * from Table where script_name FOR UPDATE.
3- execution of the script.
4- If successful then release the lock (rollback or commit).
Run Code Online (Sandbox Code Playgroud)

但我的主要问题是Mysql.选择FOR …

php mysql

2
推荐指数
1
解决办法
2551
查看次数

如何防止Perl脚本并行运行多次

我有一个可能会运行很长时间的脚本.在Linux上.当它正在运行时,当由相同或不同的用户第二次调用时,它应该检测到并拒绝运行.我正在试图弄清楚如何创建一个合适的信号量,即使进程因某种原因死亡也会被清理干净.

我遇到过如何防止PHP脚本多次运行?这当然可以应用,但我想知道这是否可以在Perl中做得更好.

例如,Perl具有"在进程退出时清理已创建的临时文件"标志(File :: Temp :: CLEANUP),我认为无论进程如何结束都会触发该标志.但是此API只能用于创建具有随机名称的临时文件,因此它不能用作信号量的文件名.我不明白文件如何被删除的基本机制,但听起来像机制存在.我如何为命名文件执行此操作,例如/ var/run/foobar?

或者有更好的方法吗?

linux perl semaphore

2
推荐指数
1
解决办法
800
查看次数

标签 统计

flock ×2

php ×2

c ×1

linux ×1

mysql ×1

perl ×1

semaphore ×1