我正在尝试编写一个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