2016-05-23 31 views
0

kornshellでは、 `basename $ 0`は私に現在のスクリプトの名前を与えます。シェルスクリプトでシングルトンを実装する方法

どのユーザーがこのサーバー上で実行した `basename $ 0`という名前のスクリプトを1つしか持たないというシングルトンパターンを実装するには、$$または$ PPIDをどのように利用するのですか?

ps -ef|grep `basename $0` 

これは、現在実行中のスクリプトの名前を持つ実行中のすべてのプロセスを表示します。

$$以外のスレッドが `basename $ 0`という名前のスクリプトを実行しているときに中止できるスクリプトが必要です。

+1

あなたに問題があるようですが、あなたはその問題の解決策をはるかに早く選択しました。実際に解決しようとしている問題は何ですか? –

+0

'ps'はこの役割には不向きです:アトミック性や並行性の保証はありません。その結果は特定の時点を表すことが保証されていません。私はフィリップとの圧倒的な合意に自分自身を見つける。 –

+0

@Goahnaryあなたの問題が、あなたのカウンターを別のスクリプトのインスタンスと重複して読む*カウンターを書く*カウンターを書くことによって引き起こされている場合は、興味深いかもしれません。 'echo foo> bar'はアトミックではないことに注意してください。最初に' bar'を空ファイル*に切り捨ててから 'foo'を書き込む前に切り捨てます。数値カウンタの場合は、一度に1つのジョブしか実行されないようにミューテックスを実装していない限り、これは0にリセットされるように見えます。 (サーバーが最近応答に時間がかかり始めたのは、なぜ最近になってバグが見え始めたのかを説明する)。 –

答えて

1

レースフリーミューテックスを提供するには、flockはあなたの友人です。あなたがLinux上にいない場合 - provided by util-linux - portable versionが利用可能です。

ユーザーアカウントを超えてシステム全体に適用する場合は、すべてのユーザーがファイルを作成できる場所にロックを置くディレクトリが必要です。すべてのユーザーあなたのロックファイルに書き込むことができます。

次のようにこのプロトコルに参加したい各プログラムが振る舞うことができ、あなたがflock有用性を持っていると仮定すると:

#!/bin/ksh 

umask 000     # allow all users to access the file we're about to create 
exec 9>"/tmp/${0##*/}.lck" # open lockfile on FD 9, based on basename of argv[0] 
umask 022     # move back to more restrictive file permissions 
flock -x -n 9 || exit  # grab that lock, or exit the script early 

# continue 

つのキーノート:は、スクリプトが終了したときにロックファイルを削除しようとしないでください。他の誰かが積極的にロックを取得しようとしている状況にある場合、それらはすでにその既存のファイルにファイル記述子を持っています。彼らがハンドルを持っている間にファイルを削除すると、他の誰かが同じ名前で新しいファイルを作成してロックしている間、そのプログラムがロックを保持していると考えることができるレースが保証されます。

+0

あなたのコマンドの間に原子性はないので、保証はありません。私は尋ねられていることが実際に彼がそれが望む方法であると信じていません。 – bodangly

+0

@bodanglyここで重要なのは、flock実行可能ファイルが 'flock'システムコールを呼び出すとすぐに、同じiノードの別のファイル記述子上の他の' flock(LOCK_EX) 'は、fdが閉じられたり、 'flock(LOCK_UN)'。シェルスクリプトはそのファイル記述子を残りの実行のためにオープンしているので、ロックを保持しているスクリプトと実行された実行可能ファイルがコピーを継承するまで、 'flock -x -n 9'行を越えることはできませんそのFDテーブルは、終了します。 –

+0

@bodangly、... http://linux.die.net/man/2/flockのプレーンテキストに照らしてあなたの意見を私に説明できますか? –

関連する問題