-1

助けが必要です。私はスクリプト 'Script 1' を持っています。これは 'Script 2' を呼び出してバックグラウンドで実行し、定期的に何かをチェックします。しかし、スクリプト 1 が複数回呼び出されても、スクリプト 2 は 1 回だけ開始する必要があります。それを行う方法はありますか?

誰かがこれを達成するためのコマンドをいくつか提案してくれれば、さらに役に立ちます。

前もって感謝します

4

1 に答える 1

1

確かに、次のようなものを の一番上に置くことができますScript2:

if [[ -f /tmp/Script2HasRun ]] ; then
    exit
fi
touch /tmp/Script2HasRun

もちろん、ファイルが削除されない限り、センチネルファイルを使用することで二度と実行されScript2なくなります/tmp。.

そのため、より適切に保護できる別の場所に配置することをお勧めします。

二度と実行するのを止めたくない場合は、sentinel ファイルを削除するメカニズムが必要です。

たとえば、一度に 1 つのコピーのみを実行することを意図している場合は、次のようになります。

if [[ -f /tmp/Script2IsRunning ]] ; then
    exit
fi
touch /tmp/Script2IsRunning
# Do whatever you have to do.
rm -f /tmp/Script2IsRunning

また、2 つのコピーが実行される可能性がある競合状態があることに注意してください。次のようなコンテンツと存在を使用して、それを軽減する方法もあります。

if [[ -f /tmp/Script2IsRunning ]] ; then
    exit
fi
echo $$ >/tmp/Script2IsRunning
sleep 1
if [[ "$(cat /tmp/Script2IsRunning 2>/dev/null)" != $$ ]] ; then
    exit
fi
# Do whatever you have to do.
rm -f /tmp/Script2IsRunning

それを超える保護レベルがありますが、それらは複雑になり、ほとんどの場合はそれで十分だと思います.

于 2012-09-25T05:53:06.630 に答える