bash:可以防止一起运行脚本吗?

时间:2012-12-09 13:48:17

标签: bash flock

对不起,我无法完全关注我的问题。

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

我记得有人说通过这种方式可能会出现无法运行脚本等问题。

有人知道这种可能性吗?

我尝试了以下方案:

  1. 运行后立即运行脚本 - 它第二次运行 完美
  2. 使用 CTRL + C 中断脚本,然后运行 它再次 - 第二次运行没问题
  3. 在脚本运行时突然关闭机器,然后打开电源 机器并重新运行脚本 - 结果相同:没问题
  4. 我无法想到更复杂的可能性。

1 个答案:

答案 0 :(得分:3)

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

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

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