2017-10-19 8 views
0

私が働く会社は、ユーザの介入なしに特定の複雑な操作を実行するために数分ごとにシェルスクリプトを実行するcrontabを設定しています。顧客があるので、彼らは何度でも次の構造を使用して、すでに実行されていない場合は、このスクリプトは、基本的には、第1チェック、シーケンス内の複数のPerlスクリプトを実行:事実を除いて、作品のLinuxプロセスが与えられた引数で実行されているかどうかをシェルスクリプトで調べる

for i in `seq 1 20`; 
do 
    ps ax | grep ourFile10000008.p | grep pl 2>> /dev/null >> $LOG 
    if [ $? -eq 1 ] ; then 
     cd /path/to/the/script 
     perl ourFile10000008.pl 10000008 & 2>> $LOG 
    fi 
    ps ax | grep ourFile10000009.p | grep pl 2>> /dev/null >> $LOG 

    if [ $? -eq 1 ] ; then 
     cd /path/to/the/script 
     perl ourFile10000009.pl 10000009 & 2>> $LOG 
    fi 
    # (and so on, and so forth...) 
done 

このようなことがあります今私たちの/path/to/the/scriptフォルダにある数十の "ourFile" Perlスクリプトであり、それらはお互いの正確なコピーです!新しい顧客がオンラインになるたびに、新しいレプリカを作成する必要があります。このレプリカを使用すると、この構造を維持することが非常に難しくなります。

私は、これらのスクリプトの別のコピーですが、新しい引数とするたびに呼び出された([theOneFile.pl]としてここに命名)の単一のファイルで、この構造の実行を作るしようとしています。これはうまくいきましたが、今は引数ごとにこのファイルを実行していることを確認しなければなりません。

調査の末、This answerのおかげで、実行中の[theOneFile.pl]の後ろにある引数がpgrep -af theOneFile.pl | tr '\000' ' '| awk '{print $4}' >> $LOGに到達しました。しかし、これは私にコンテンツの結果リストを提供します。今日のロジックをできるだけ損なわないようにするために、私は特定の引数を指定して実行しているプロセス(たとえばtheOneFile.pl 10000009など)が1つしかないかどうかを判断しようとしていますが、そう。何か案は? (使用している)

答えて

0

pgref -fプロセスのコマンドライン全体へのパターンだけでなく、プロセス名と一致しません。それは言った、あなたが使用することができます。

arg="foo" 
pgrep -f "theOneFile.pl.*${arg}" 

まあ、pgrepアプローチは、競合状態に陥りやすいです。 1つの引数につきexclusive lockを使用するようにスクリプト自体を変更する方が良いでしょう。

関連する問題