2016-05-05 8 views
0

shを使用して実行するとスクリプトが正常に機能しません。 cronjobであっても問題なく実行できました。/bin/shを使用しているときにスクリプトが正しく実行されない

/bin/sh process_check.sh 

しかし、私は次のよう

./process_check.sh 

スクリプト使用して実行したときに罰金実行するようだ

#/bin/sh 
    $service=xxx 

    if (($(/bin/ps -ef | grep $service | wc -l) > 1)) 
     then 
     true 
     else 
     echo "$service is not running!!!" 
     /usr/sbin/xxx 
     fi 
(それが動作していない場合は、プロセスが実行されている場合はチェックを、処理を実行します)

また、これをもっと効率的にする方法はありますか?私は常に実行していることを確認しようとしているコンパイルされたプログラムがあります。

+0

'if(($(/ bin/ps -ef | grep $ service | wc -l)> 1));)の代わりに。 'もっと簡単に試してみてください:if/bin/ps -ef | grep -q $サービス;その後 ' –

+0

@WilliamPursellそれに問題があります。 '$ service'が実行されていなくても、' grep -q $ service'プロセスが 'ps'出力に含まれるかもしれません。そのため、OPのコードは '> 1 '(2つ以上)を要求したのです。 '$ service'にマッチするプロセスです。 – John1024

+0

Bourne Shell( 'sh')で実行しますが、Bourneで定義されていない'((.... ....) 'と' $(....) 'を使用しています。もちろん、システム上でshがbashにリンクされている場合、このエラーは明白ではありません。 – user1934428

答えて

1

一つの問題は、この行です:

$service=xxx 

これはおそらく次のようになります。

また
service=xxx 

、次は本質的に信頼できないです:

(($(/bin/ps -ef | grep $service | wc -l) > 1)) 

プロセスの数がこれを見つけましたマルチタスキングシステムでは、タイミングの事故に依存します。より信頼性の高いアプローチがpgrepを使用することです:

pgrep "$service" 

これはgrepマッチング処理の可能性なし$serviceためのPIDを一覧表示されます。

pgrepは有用なリターンコードをすべて単独で設定するため、数学テストは必要ありません。このように、交換してください:

if (($(/bin/ps -ef | grep $service | wc -l) > 1)) 

で:-qpgrepがちょうどPIDはstdoutに一覧表示せずに終了コードを設定するように指示

if pgrep -q "$service" 

。あなたのpgrep-qオプションをサポートしていない場合

は、その後、使用します!

if pgrep "$service" >/dev/null 
+0

ありがとう! -qは私にとってはうまくいかないようですが、単にpgrep "service"を使うことはできますか?私はSH4.1 –

+0

@LeRay OKを使用しています。あなたの 'pgrep'が' -q'をサポートしていない場合の対処方法を更新しました。(最近のlinuxは 'pgrep -q'をサポートしているはずですが、OSに' pgrep'がない場合は教えてください)。 – John1024

1

をスクリプトの最初の行では、#/ binに/ shの代わりに#の/ binに/ SHを使用しました。 ./process_check.shを使用すると、/ bin/shの代わりに/ bin/bashが使用されます。

関連する問題