2012-04-16 100 views
0

我正在嘗試編寫一個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 

如可以看到的第一命令的輸出不是所期望的,而第二個命令的輸出是正確的。

我在這裏做錯了什麼?

+1

聽起來就像你假設只有一個進程可以在命令行中有。 – 2012-04-16 05:58:52

+0

這不是問題的關鍵。我問的是爲什麼命令行返回0而shell腳本返回2?有句法問題嗎? – RedBaron 2012-04-16 06:00:06

+3

看看你的劇本的名字......這將是一個問題。 – Mat 2012-04-16 06:00:44

回答

2

提示:你的腳本叫什麼?

+0

Ohh <羞怯的笑容> – RedBaron 2012-04-16 06:04:05

1

不完全是一個答案,而是一堆評論。

  1. 你應該考慮使用pidfile而不是依賴於PS,grep的,廁所等進行跟蹤的過程。將pid寫入一個文件並用它來檢查進程是否正在運行。您目前的做法已經出現錯誤。

  2. 爲什麼要檢查界面的狀態?難道你不能把它切換到混雜模式嗎?我沒有玩過這個遊戲,但這是我第一件想到的事情。