web-dev-qa-db-ja.com

シェルスクリプトにミューテックス/セマフォメカニズムはありますか?

シェルスクリプトでmutex /セマフォ/同時実行メカニズムを探しています。次の状況を検討してください。「a」ユーザーが共有ファイルを閉じない限り、「b」ユーザーはそれを開いたり更新したりできません。シェルスクリプトでミューテックス、セマフォ、クリティカルセクションなどを実装する方法を考えているところです。

シェルスクリプトでロックメカニズム[ファイルレベル]を実装する最も簡単な方法はどれですか。

27
Mandar Pande

Bashでのファイルロックの詳細については、 BashFAQ および ProcessManagment を参照してください。

質問にシェル(のみ)のタグを付けると、助けてくれる人の数が制限されます。 unix、ksh、bashを追加することもできます。

このトピックに関しては、S.O。に既に投稿されている多数の質問/回答があります。

これがお役に立てば幸いです。

13
shellter

Shellterによって指摘された BashFAQ には、いくつかの良い例があります。ページを自己完結させるためにここに移動する基本的な考え方は、テストと設定の両方を同時に行う操作を使用することです mkdir

mkdirは、ディレクトリが存在する場合は失敗し、存在しない場合は作成されます。これはアトミック操作であり、シェルスクリプトでミューテックスを実行する場合と同様に使用できます(上記のBashFAQから)

# Bourne
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    # continue script
else    # failed to create the directory, presumably because it already exists
  echo >&2 "cannot acquire lock, giving up on $lockdir"
  exit 0
fi

クリーンアップやその他の項目の詳細については、リンクをたどってください。

39
Paul Rubel

flockユーティリティを使用して、ファイルをロックしたり、ミューテックスとして使用したりできます。

例:

#!/bin/sh -eu
#advanced bash stuff not needed
: >> lock #create a file if it doesn't exist
{
flock 3 #lock file by filedescriptor

echo $$ working with lock
sleep 2
echo $$ done with lock

} 3<lock

使用例:

./mx & ./mx & ./mx & #will run one at a time cuz of the lock

massimo のポイントに応えて:

ファイル記述子番号をハードコーディングしたくない場合(0、1、または2をハードコーディングしていない場合でも問題になることはめったにありませんが、とにかく)、bashで(ただし、POSIXのみのシェルでは)、次のようにすることができます。システムは次の方法でfdを選択します。

{
flock $fd
#...
} {fd}<lock

6
PSkocik