【问题标题】:Bash script to check if service is running [duplicate]用于检查服务是否正在运行的 Bash 脚本 [重复]
【发布时间】:2015-05-07 06:09:29
【问题描述】:

我已经编写了以下脚本

#! /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 正在运行?
  • 再一次 - 评论与我的问题几乎是正交的。
  • 可能没什么区别,但你应该引用"$1"
  • 如果机器上的其他人正在运行像vim nginx-instructions.txt 这样的命令,你的函数会报告 nginx 正在运行,无论它是否真的在运行。不要重新发明已经存在的许多服务监控程序。

标签: bash


【解决方案1】:

在 *nix 中检查服务是否正在运行的常规方法是执行以下命令:

/etc/init.d/servicename status

例如

/etc/init.d/mysqls status

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

【讨论】:

  • 这对于应用程序实际注册为应有的服务的 linux 是正确的,对于具有 bash 的其他环境,例如 OSX,这不是正确的解决方案。
  • @Oleg Mikheev 我对你的回答投了反对票。如果我想知道“如何检查正在运行的进程的状态”,我会问这个问题。你回答了一个完全不同的问题。如果您必须知道 - 我没有使用 etc/init.d/proc statusservice proc status 因为返回的答案不一致。大多数情况下它是proc is running,但例如,php5-fpm 返回php5-fpm start/runningphp5-fpm stop/waiting
  • 公平地说,你确实问过“Bash script to check if service is running”这个问题,而 Oleg 的回答正是如此。
【解决方案2】:

将单词边界和否定的lookahead regex 添加到您的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"

【讨论】:

  • 这有什么不同?
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多