スクリプトが実行中かどうかを確認し、そのインスタンスが完了するまで一時停止して再度実行するにはどうすればよいですか?

スクリプトが実行中かどうかを確認し、そのインスタンスが完了するまで一時停止して再度実行するにはどうすればよいですか?

ファイルにデータを追加するこのスクリプトを実行し、スクリプトがすでに実行されているかどうかを確認するために何かを追加しようとしています。実行されている場合は、一時停止して 20 秒後に再度確認し、実行されていないことがわかるまでこれを繰り返します。実行されていないことがわかると、スクリプトの残りの部分に進みます。続行しても問題ないことがわかるまで確認を続ける方法を知る必要があります。誰かアイデアはありますか?

    if [ `ps -ef| grep $script_name_with_arguments | wc -l ` -gt 1 ]
    then
      echo "already running"
      sleep 20s
    else
      echo "ok"
    fi
}```

答え1

何らかのロックを使用します。

最も簡単な方法はロックファイルです。ロックファイルを管理するパッケージがいくつかあります。プラットフォームやディストリビューションが何であるかを述べていないので、それについて正確にはわかりませんが、そのうちの 1 つはプログラムprocmailに付属するパッケージですlockfile

スクリプトでは次のように使用します。

LOCK=/run/npaulsen/mylockfile.lock
lockfile -20 $LOCK
run_the_fscking_rest_of_my_script
rm -f $LOCK

1 つのインスタンスがクラッシュした場合に、無期限にスタック状態にならないようにするための改良点がいくつかあります。これについては、man ページを参照してください。man 1 lockfileまたは、独自の実装を行うこともできます。これは簡単ですが、実際のプログラミング言語 (シェル スクリプトではない) が必要になります。

もう 1 つのより洗練された (ただしより複雑な) アイデアは、POSIX セマフォを使用することです。 を試してみてくださいman 7 sem_overview

関連情報