我有一个用于 iperf 的脚本,可以像典型服务一样启动、停止和检查它的状态。如果我发出“service iperf start”或“service iperf stop”,它会正常工作。当我尝试发出“服务 iperf 状态”时,它总是将其返回为正在运行,即使它没有运行。
运行时:
#service iperf status
/usr/bin/iperf pid 37567 is running!!!
不运行时:
# service iperf status
/usr/bin/iperf pid is running!!
这是我的整个脚本:
#!/bin/bash
# chkconfig: - 50 50
# description: iperf
DAEMON=/usr/bin/iperf
service=iperf
info=$(pidof /usr/bin/iperf)
is_running=`ps aux | grep -v grep | grep iperf | wc -l | awk '{print $1}'`
case "$1" in
start)
$DAEMON -s -D
;;
stop)
pidof $DAEMON | xargs kill -9
;;
status)
if [ $is_running != "1" ];
then
echo $DAEMON pid $info is running!!!
else
echo $DAEMON is NOT running!!!
fi
;;
restart)
$DAEMON stop
$DAEMON start
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
;;
esac
它似乎无法读取脚本状态部分中的第一个 echo 语句。我已从命令行在脚本之外运行了 ps 命令,以验证我是否获得了正确的输出。如果服务正在运行,它将返回“1”,就像脚本检查的那样。如果它没有运行,它会返回“0”,因此它应该继续执行下一个 echo 语句,但事实并非如此。谁能告诉我如何解决这个问题?
我使用的是 RHEL 6.7 bash 版本 4.1.2
答案1
我想你想改变线路
if [ $is_running != "1" ];
成为
if [ "$is_running" != "0" ];
这样,当没有任何iperf
运行实例时, if 就会失败,并打印所需的状态消息。正如目前所写的iperf
,只有当恰好有 1 个进程时,它才会报告未运行。
答案2
我想到了。和使用ps有关系。我想当你调用“service iperf status”命令 ps 时总会找到一个带有 iperf 的进程。所以该值将始终为“1”,而不会是其他任何值。于是我用netstat来查找进程。在我的脚本中我使用:
IS_RUNNING=$(netstat -anp | grep ":5001" | grep "iperf" | awk '{print $7}' | cut -d"/" -f 2)
如果运行该命令,将导致该命令找到“iperf”
然后你可以这样写 if 语句:
if [ "$IS_RUNNING" = iperf ];
这解决了我的问题。