質問: bashスクリプトの1つのインスタンスのみが実行されていることを確認する最良の方法は何ですか? 特定のスクリプトの1つのインスタンスのみが実行されていることを確認するための最も単純/最良の方法は何ですか-linuxでbashを想定していますか?現在、私はやっています:ps -c script.name.sh > /dev/null 2>&1 || ./script.name.sh ただし、いくつかの問題があります。 スクリプトの外側にチェックを配置します 別のアカウントから同じスクリプトを実行することはできません。 -cプロセス名の最初の14文字のみをチェックします もちろん、独自のpidfile処理を記述できますが、簡単な方法があるはずです。
回答: 最初のテスト例[[ $(lsof -t $0| wc -l) > 1 ]] && echo "at least one of $0 is running" 2番目のテスト例currsh=$0 currpid=$$ runpid=$(lsof -t $currsh| paste -s -d " ") if [[ $runpid == $currpid ]] then sleep 11111111111111111 else echo -e "\npid($runpid)($currpid) ::: at least one of \"$currsh\" is running !!!\n" false exit 1 fi 説明「lsof -t」は、「$ 0」という名前の現在実行中のスクリプトのすべてのpidをリストします。コマンド「lsof」には2つの利点があります。 vimは「.file.swp」などのマッピングファイルを編集するため、vimなどのエディターで編集しているpidは無視します。 現在実行中のシェルスクリプトによって分岐されたpidを無視します。ほとんどの「grep」派生コマンドでは実行できません。 「pstree -ph pidnum」コマンドを使用して、現在のプロセス分岐ステータスに関する詳細を表示します。