2つのスクリプトを作成しようとしています。ただし、2回連続して実行されるのを防ぐために問題が発生します。たとえば、script1とscript2があります。 script1が最後に実行されてからscript2が実行された場合にのみ、script1を実行したいと思います。どんなアイデアがありますか?
答え1
スクリプトAでファイルが存在することを確認し、存在しない場合は/ tmpディレクトリtouch /tmp/script.lock
にあるファイルをタッチしてコードを実行します。次に、スクリプトBにファイルが存在することを確認します。ファイルが存在する場合、スクリプト本体が実行され、ファイルが削除されます。
スクリプトA:
if [ ! -f /tmp/script.lock ]
then
echo hello
touch /tmp/script.lock
fi
スクリプトB:
if [ -f /tmp/script.lock ]
then
echo hello
rm /tmp/script.lock
fi
答え2
各スクリプトに特定のファイル(たとえば/var/tmp/script1-2
)を確認させます。
チェックファイルが存在しない場合は、このスクリプトの実行時に実行されないように、できるだけ早く別のスクリプトの名前をファイルに作成してください。
存在し、独自の名前が含まれている場合は終了します。それ以外の場合は正常に実行されます。
終了する前に、各スクリプトはファイルに一意の名前を付ける必要があります。
CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1
# rest of script here
.
.
echo "$MYNAME" > "$CHECKFILE"
オプションgrep
は次のとおりです。
-q
静かになるために出力は生成されません。-w
単語全体を一致させるためにのみ使用されます。-F
正規表現ではなく固定文字列を照合するために使用されます。
注:両方のスクリプトが実行されている場合正確に同時に、$ CHECKFILEがまだ存在しない場合はすべて実行されます。最後に完了したもの(実行に時間がかかります)が何であれ、その名前は最終的に$ CHECKFILEに書き込まれます。これを防ぐには、そのecho script2 > /var/tmp/script1-2
エントリを実行する前に実行してください。
答え3
1つのオプションは、スクリプト1で「date」コマンドを実行し、この出力を「file.txt」などの一部のファイルにリダイレクトすることです。その後、スクリプト2はこの「file.txt」を読み、「date」ファイル間を移動して日付を比較できます。スクリプト2が実行された日まで? 「日付」比較は比較的簡単です。 Webには多くの例があります。考えてみる価値があります。
要件に応じて、他のオプションはもちろん、「cron」作業項目を追加することです。
答え4
以前にscript2が実行されたかどうかを知りたい場合は、次のようにします。
script2のどこからでも次のことを行います。
touch .ran_already
。
それではscript1で実行してください。
if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi
速くて汚れていても、これはあなたにとって良いです。