1. ホーム
  2. linux

[解決済み] Bashスクリプトのインスタンスが1つしか実行されていないことを確認する最善の方法は何ですか?重複

2022-07-13 08:23:47

質問

与えられたスクリプトの1つのインスタンスのみが実行されていることを確認する最もシンプルで最良の方法は何ですか - Linux上のBashであると仮定して?

今のところ、私はやっています。

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

が、いくつかの問題があります。

  1. スクリプトの外側にチェックを置く
  2. 別々のアカウントから同じスクリプトを実行することができない - これは私が時々望むことです。
  3. -C プロセス名の最初の 14 文字のみをチェックします。

もちろん、自分でpidファイルの処理を書くこともできるのですが、簡単な方法があるはずだと感じています。

どのように解決するのか?

スクリプトがすべてのユーザーで同じである場合、スクリプトに 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