检查服务是否正在运行的Bash脚本

5
我已编写以下脚本。
#! /bin/bash
function checkIt()
{
 ps auxw | grep $1 | grep -v grep > /dev/null

 if [ $? != 0 ]
 then
   echo $1"bad";
 else
   echo $1"good";
 fi;
}

checkIt "nginx";
checkIt "mysql";
checkIt "php5-fpm";

这里的问题似乎出在最后一个检查项checkIt "php5-fpm",它总是返回php5-fpmbad。问题似乎源于连字符。如果我只写checkIt "php5",那么就会得到预期的结果。虽然我没有其他以php5开头或包含php5的进程,但这实际上是一种折中办法,而且迟早会出问题。如果有人能告诉我如何使checkIt "php5-fpm"正常工作,我将不胜感激。

你意识到如果你用命令行运行应用程序 vi nginx.xml,你的脚本会认为nginx正在运行吗? - Oleg Mikheev
再次强调 - 这条评论与我的问题基本无关。 - DroidOS
1
可能没有什么影响,但你应该真正引用 "$1" - user4453924
如果机器上有其他人正在运行像 vim nginx-instructions.txt 这样的命令,你的函数会报告 nginx 正在运行,无论它是否真的在运行。不要重新发明已经存在的许多服务监控程序。 - chepner
2个回答

9
在*nix系统中检查服务是否正在运行的常规方法是执行以下操作:
/etc/init.d/servicename status

e.g.

/etc/init.d/mysqls status

这些脚本通过PID检查状态,而不是搜索ps输出。

这对于 Linux 是正确的,因为应用程序实际上已经像服务一样注册了,这是应该的。但对于其他有 bash 的环境,比如 OSX,这不是正确的解决方案。 - user177800
@Oleg Mikheev 我已经给你的回答投了反对票。如果我想知道“如何检查正在运行的进程的状态”,我会问那个问题。你回答了一个完全不同的问题。如果你一定要知道 - 我没有使用 etc/init.d/proc statusservice proc status,因为返回的答案不一致。大多数情况下是 proc is running,但是例如,php5-fpm 返回 php5-fpm start/runningphp5-fpm stop/waiting - DroidOS
5
公平地说,针对Oleg,你确实问了“检查服务是否正在运行的Bash脚本”的问题,而Oleg恰好回答了这个问题。 - wallenborn

4
在你的grep中加入单词边界和负向前瞻正则表达式,示例如下:

添加单词边界和负向前瞻正则表达式到您的grep:

#!/bin/bash
function checkIt()
{
 ps auxw | grep -P '\b'$1'(?!-)\b' >/dev/null
 if [ $? != 0 ]
 then
   echo $1"bad";
 else
   echo $1"good";
 fi;
}

checkIt "nginx"
checkIt "mysql"
checkIt "php5-fpm"

这有什么区别吗? - user4453924

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接