【问题标题】:bash: Could flock prevent from running the script all together?bash:flock 会阻止一起运行脚本吗?
【发布时间】:2012-12-09 13:48:16
【问题描述】:

很抱歉,我无法完全集中我的问题。

我正在尝试使用flock 来避免同时运行脚本,就像在接受的答案中描述的那样: How to prevent a script from running simultaneously?

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

有人知道这种可能性吗?

我尝试了以下场景:

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

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

【问题讨论】:

    标签: bash flock


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-27
      • 2017-06-06
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2014-07-18
      • 2018-04-24
      相关资源
      最近更新 更多