一尘不染

确保只有一个Bash脚本实例正在运行的最佳方法是什么?

linux

确保给定脚本仅一个实例正在运行的最简单/最佳方法是什么(假设它是Linux上的Bash)?

目前,我正在做:

ps -C script.name.sh > /dev/null 2>&1 || ./script.name.sh

但是它有几个问题:

  1. 它把检查放在脚本之外
  2. 它不允许我从单独的帐户运行相同的脚本-有时我想这样做。
  3. -C 仅检查进程名称的前14个字符

当然,我可以编写自己的pidfile处理程序,但我认为应该有一种简单的方法。


阅读 485

收藏
2020-06-02

共1个答案

一尘不染

如果所有用户的脚本都相同,则可以使用一种lockfile方法。如果您获得了锁,请继续执行其他操作,并显示一条消息并退出。

举个例子:

[Terminal #1] $ lockfile -r 0 /tmp/the.lock
[Terminal #1] $

[Terminal #2] $ lockfile -r 0 /tmp/the.lock
[Terminal #2] lockfile: Sorry, giving up on "/tmp/the.lock"

[Terminal #1] $ rm -f /tmp/the.lock
[Terminal #1] $

[Terminal #2] $ lockfile -r 0 /tmp/the.lock
[Terminal #2] $

/tmp/the.lock获得脚本后,您的脚本将是唯一可以执行的脚本。完成后,只需取下锁。在脚本形式下,它可能类似于:

#!/bin/bash

lockfile -r 0 /tmp/the.lock || exit 1

# Do stuff here

rm -f /tmp/the.lock
2020-06-02