2

对不起,我不能完全集中我的问题。

我正在尝试使用flock 来避免同时运行脚本,就像在接受的答案中描述的那样: 如何防止脚本同时运行?

我记得有人说这样可能会出现根本无法运行脚本之类的问题。

有人知道这种可能性吗?

我尝试了以下场景:

  1. 运行脚本后立即运行它 - 它第二次完美运行
  2. CTRL用+中断脚本,C然后再次运行 - 第二次运行没问题
  3. 在脚本运行时突然关闭机器,打开机器电源并重新运行脚本 - 结果相同:没问题

我想不出更复杂的可能性。

4

1 回答 1

3

顾名思义,该flock实用程序包装了flock(2)系统调用,其文档指出它将锁与打开文件表中的 fd 条目相关联。当最后一个文件描述符关闭时,打开的文件会被删除,并且描述符本身就是临时资源,当进程以任何方式退出时会自动清理,包括kill -9. 强制关闭机器会擦除正在运行的系统的整个状态,因此与打开的文件相关的锁也无法在这种情况下存活。因此,及时退出的脚本不应阻塞系统。

想到的一种现实的阻塞可能性是脚本有一个导致它无限期挂起的错误,这确实会阻止其他实例运行。如果在实践中预计会发生这种情况,可以通过$$在获取锁后立即将脚本 PID ( ) 写入锁文件中来处理。在获取锁之前,等待锁的进程将使用-wto 选项指定超时flock。如果超时,它将从锁文件中读取挂锁所有者的PID,杀死所有者,并重复锁定过程。

一个理论上的问题是硬编码的文件描述符编号 200。如果您的脚本打开了 200 个文件,或者是从一个打开 200 个文件但没有 close-on-exec 位的程序生成的,您将破坏现有的文件描述符。这在实践中极不可能发生。

于 2012-12-09T14:04:03.927 回答