2017-09-10 10 views
1

他の端末が別の端末を実行しているときに他の端末がbashで実行されないようにしたいのですが、それをやり遂げよう。どんな助けやヒントも非常に高く評価されました!別の端末がスクリプトを実行している間に他の端末がスクリプトを実行しないようにする

例: そのスクリプトが別の端末で実行されている場合、他のすべての端末もその特定のスクリプトを実行できません。そして、「メンテナンス中です」というメッセージを表示します。

答えて

1

「ロックファイル」という概念を使用できます。たとえば:

if [ -f ~/.mylock ]; then 
    echo "UNDER MAINTENANCE" 
    exit 1 
fi 
touch ~/.mylock 

# ... the rest of your code 

rm ~/.mylock 

は/より安全な手の込んだ取得するには、「トラップ」EXIT信号は、終了時に自動的に削除することができます。

trap 'rm ~/.mylock' EXIT 
+1

これは完璧なレースコンディションです。 – hek2mgl

2

は、競合状態を避けるために、あなたが一緒にflock(1)を使用することができますa ロックファイル。 Linux、BSD、OS Xで動作すると主張するone flock(1) implementation があります。私はUnixに対して明示的に を見たことがありません。
興味深い議論があるhereです。

UPDATE:
私はランダル・L・シュワルツhereから本当に賢い方法を見つけました。私は本当にこれが好きです。それはflock(1)bashがあることに依存し、スクリプト自身を独自のロックファイルとして使用します。これをチェックアウト:

/usr/local/bin/onlyOneがロック

#!/bin/bash 
exec 200< $0 
if ! flock -n 200; then 
    echo "there can be only one" 
    exit 1 
fi 

を取得するためのスクリプトは、次にmyscriptがロック(またはしない)を取得するためにonlyOneを使用している:

#!/bin/bash 
source /usr/local/bin/onlyOne 
# The real work goes here. 
echo "${BASHPID} working" 
sleep 120 
+0

私は_Highlander_参照に残しました。それらを取り除くことはやや凶悪なようでした。 –

1

使用flockとトップでこれを置きますあなたのスクリプトの:

if ! flock -xn /path/to/lockfile ; then 
    echo "script is already running." 
    echo "Aborting." 
    exit 1 
fi 

注:path/to/lockfileはあなたのスクリプトのパスになります。そうすることで余分なファイルが作成されることはありません。

関連する問題