0

特定のプログラムが実行されているかどうかを確認し、実行されていない場合はサービスを再起動するシェル スクリプトを作成しようとしています。また、インターフェイスが無差別モードかどうかもチェックします。そうでない場合は、そのモードになります。

progxyzが実行されているかどうかを確認するには、コマンドラインで次のようにします。

ps -ef | grep -v grep | grep xyz | wc -l

0 が返された場合、プログラムは実行されていません。それ以外の場合は実行されています。

同様に、インターフェイスが無差別モードであるかどうかを確認するには、コマンドラインで次のことを実行できます

ip link show eth0 | grep -i promisc | wc -l

ここでも戻り値が 1 の場合、インターフェイスは無差別モードです。

問題は、シェルスクリプトにすべてをバンドルしようとしたときに発生します。

#!/bin/bash
SERVICE="daemonlogger"
x=$(ps -ef|grep -v grep|grep $SERVICE|wc -l)
if [ "$x" -eq 1 ]; then
 run=0
 else
 run=1
fi
IF_NAME="eth0"
y=$(ip link show $IF_NAME|grep -i promisc|wc -l)
if [ "$y" -eq 1 ]; then
 :
 else
 ifconfig $IF_NAME promisc up
fi
if [ "$run" -eq 1 ]; then
 service $SERVICE restart > /dev/NULL 2>&1
fi
echo $run

コマンドラインから実行した場合のコマンドの出力は次のとおりです。

[root@dheerajpc Desktop]# ps -ef | grep -v grep | grep daemonlogger | wc -l
0
[root@dheerajpc Desktop]# ip link show eth0 | grep -i promisc | wc -l
0

デバッグモードで実行した出力は次のとおりです

[root@dheerajpc Desktop]# bash -x check_daemonlogger 
+ SERVICE=daemonlogger
++ ps -ef
++ wc -l
++ grep daemonlogger
++ grep -v grep
+ x=2
+ '[' 2 -eq 1 ']'
+ run=1
+ IF_NAME=eth0
++ grep -i promisc
++ ip link show eth0
++ wc -l
+ y=0
+ '[' 0 -eq 1 ']'
+ ifconfig eth0 promisc up
+ '[' 1 -eq 1 ']'
+ service daemonlogger restart
+ echo 1
1

ご覧のとおり、最初のコマンドの出力は期待どおりではありませんが、2 番目のコマンドの出力は正しいものです。

ここで何が間違っていますか?

4

2 に答える 2

2

ヒント: あなたのスクリプトは何と呼ばれていますか?

于 2012-04-16T06:00:57.887 に答える
1

正確な答えではありませんが、たくさんのコメントがあります。

  1. pidfileプロセスを追跡するには、ps、grep、wc などに頼るのではなく、a の使用を検討する必要があります。pid をファイルに書き込み、それを使用してプロセスが実行されているかどうかを確認します。現在のアプローチでは、すでにエラーに遭遇しています。

  2. インターフェイスのステータスを確認する理由は何ですか? とにかく無差別モードに切り替えることはできませんか?私はこれで遊んだことはありませんが、これは私に最初に起こったことです。

于 2012-04-16T06:02:18.913 に答える