使用shell脚本计算进程数

时间:2012-04-16 05:56:30

标签: bash 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

如果return为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

从命令行运行的命令输出是

[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 个答案:

答案 0 :(得分:2)

提示:你的脚本叫什么?

答案 1 :(得分:1)

不是答案,而是一堆评论。

  1. 你应该考虑使用pidfile而不是依靠ps,grep,wc等来跟踪这个过程。将pid写入文件并使用它来检查进程是否正在运行。您已经使用当前方法遇到错误。

  2. 为什么要检查界面的状态?难道你不能把它切换到混杂模式吗?我没有玩过这个,但这是我发生的第一件事。