我正在嘗試編寫一個shell腳本,該腳本查看特定程序是否正在運行,如果不是,則重新啓動該服務。 它也檢查接口是否處於混雜模式。如果不是,它會將其置於該模式。使用shell腳本計算進程數
要檢查是否PROG xyz
正在運行,我可以做的命令行
ps -ef | grep -v grep | grep xyz | wc -l
如果返回0,progrma沒有運行以下,否則在運行
同樣檢查,如果接口處於promisc模式我可以在命令行上執行以下操作:
ip link show eth0 | grep -i promisc | wc -l
如果返回值爲1,則接口處於promisc模式。
當我嘗試將它全部綁定到shell腳本中時,問題就出現了。
#!/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
如果在命令行運行的命令的輸出是
[[email protected] Desktop]# ps -ef | grep -v grep | grep daemonlogger | wc -l
0
[[email protected] Desktop]# ip link show eth0 | grep -i promisc | wc -l
0
下面是在調試模式下運行它的輸出
[[email protected] 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
如可以看到的第一命令的輸出不是所期望的,而第二個命令的輸出是正確的。
我在這裏做錯了什麼?
聽起來就像你假設只有一個進程可以在命令行中有。 – 2012-04-16 05:58:52
這不是問題的關鍵。我問的是爲什麼命令行返回0而shell腳本返回2?有句法問題嗎? – RedBaron 2012-04-16 06:00:06
看看你的劇本的名字......這將是一個問題。 – Mat 2012-04-16 06:00:44