特定のプログラムが実行されているかどうかを確認し、実行されていない場合はサービスを再起動するシェル スクリプトを作成しようとしています。また、インターフェイスが無差別モードかどうかもチェックします。そうでない場合は、そのモードになります。
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 番目のコマンドの出力は正しいものです。
ここで何が間違っていますか?