
2 つのスクリプトを書こうとしています。しかし、どちらかが 2 回続けて実行されるのを防ごうとすると、問題が発生します。たとえば、スクリプト 1 とスクリプト 2 があるとします。スクリプト 1 を最後に実行してからスクリプト 2 が実行された場合にのみ、スクリプト 1 を実行できるようにしたいのですが、何かアイデアはありますか?
答え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」を読み取り、この日付とスクリプト 2 が実行された日付との間で「日付」比較を行うというものがあります。「日付」比較は比較的簡単に実行できるはずです。Web 上には多くの例があります (と私は思います)。参考になります。
もう 1 つのオプション (要件によって異なります) は、もちろん「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
これは手っ取り早くて汚い方法ですが、役に立つでしょう。