2017-05-24 5 views
0

lsofコマンドを使用してsetup.shのインスタンスを1つだけ実行しています。しかし、私はsetup.shで引数を渡す必要があった。lsof linuxコマンドで引数の値で実行中のインスタンスをカウントする

setup.sh machine1に setup.sh machine2で setup.sh machine3に

setup.sh machine1には、実行していると、再び同じコマンドが実行されている場合setup.sh machine1には完了するまで、だから、それは待機します。私はlsofがプロセスのためであり、可能ではないかもしれないと思うが、待っているロジックのための他の良い提案?

私が何らかの引数を渡そうとすると、lsofコマンドで構文エラーが発生しましたが、私は以下を試しましたが運はありません。私の目的はmachine1を使用するインスタンスを1つだけ実行し、誰かがmachine1引数でsetup.shを実行しようとすると、待機する必要があります。他のファイルロック/待機ロジック?

if ([[ $(lsof -t \setup.sh 'machine1'| wc -l) > 1 ]]); then 
if ([[ $(lsof -t '\setup.sh machine1'| wc -l) > 1 ]]); then 
if ([[ $(lsof -t "\setup.sh machine1"| wc -l) > 1 ]]); then 

ワーキング:
if ([[ $(lsof -t \setup.sh| wc -l) > 1 ]]); then 
    echo -e "\tWaiting for 2 minutes...\n" 
    sleep 2m 
else 
    echo -e "\tFree now to run setup.sh\n" 
fi 

は動作しません(構文エラー):
if ([[ $(lsof -t \setup.sh machine1| wc -l) > 1 ]]); then 
    echo -e "\tWaiting for 2 minutes...\n" 
    sleep 2m 
else 
    echo -e "\tFree now to run setup.sh\n" 
fi 
+0

なぜ 'setup.sh'の前にスラッシュを入れたのですか? – Inian

+0

現在、スクリプトが配置されている/実行中のパスです。 –

答えて

0

あなたは次のようなps -eo argsを使用して引数を持つプロセスを検索することができます。

ps -eo args | grep '^setup.sh machine1' | wc -l 

あなたのケースに合わせてgrepパターンを変更する必要があります。

0

Greg's Wikiには、プロセス管理に関する素晴らしい記事、特に "How do I make sure only one copy of my script can run at a time?"があります。 lsofは、出力がlsofであることを確認してから続行するまでの競合状態が存在するため、1つのプロセスのみが実行されていることを保証する信頼できる方法ではありません。 2つのプロセスがほぼ同時に開始した場合、両方が並行して実行される可能性があります。

関連する問題