他の端末が別の端末を実行しているときに他の端末がbashで実行されないようにしたいのですが、それをやり遂げよう。どんな助けやヒントも非常に高く評価されました!別の端末がスクリプトを実行している間に他の端末がスクリプトを実行しないようにする
例: そのスクリプトが別の端末で実行されている場合、他のすべての端末もその特定のスクリプトを実行できません。そして、「メンテナンス中です」というメッセージを表示します。
他の端末が別の端末を実行しているときに他の端末がbashで実行されないようにしたいのですが、それをやり遂げよう。どんな助けやヒントも非常に高く評価されました!別の端末がスクリプトを実行している間に他の端末がスクリプトを実行しないようにする
例: そのスクリプトが別の端末で実行されている場合、他のすべての端末もその特定のスクリプトを実行できません。そして、「メンテナンス中です」というメッセージを表示します。
「ロックファイル」という概念を使用できます。たとえば:
if [ -f ~/.mylock ]; then
echo "UNDER MAINTENANCE"
exit 1
fi
touch ~/.mylock
# ... the rest of your code
rm ~/.mylock
は/より安全な手の込んだ取得するには、「トラップ」EXIT
信号は、終了時に自動的に削除することができます。
trap 'rm ~/.mylock' EXIT
は、競合状態を避けるために、あなたが一緒に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
私は_Highlander_参照に残しました。それらを取り除くことはやや凶悪なようでした。 –
使用flock
とトップでこれを置きますあなたのスクリプトの:
if ! flock -xn /path/to/lockfile ; then
echo "script is already running."
echo "Aborting."
exit 1
fi
注:path/to/lockfile
はあなたのスクリプトのパスになります。そうすることで余分なファイルが作成されることはありません。
これは完璧なレースコンディションです。 – hek2mgl