Bash 为什么pgrep在此过程监视器中失败?

Bash 为什么pgrep在此过程监视器中失败?,bash,monitor,grep,Bash,Monitor,Grep,我有一个监视shell脚本,它可以有效地监视并保持进程运行。但它常常失败,因为它启动了第二个、第三个或更多的过程实例。我还看到pgrep命令(pgrep-n-fwx_nanoserver)在命令行返回错误的pid 这是我的剧本: #!/bin/bash check_process() { # echo "$ts: checking $1" [ "$1" = "" ] && return 0 [ `pgrep -n -f $1` ] && retur

我有一个监视shell脚本,它可以有效地监视并保持进程运行。但它常常失败,因为它启动了第二个、第三个或更多的过程实例。我还看到pgrep命令(pgrep-n-fwx_nanoserver)在命令行返回错误的pid

这是我的剧本:

#!/bin/bash

check_process() {
  # echo "$ts: checking $1"
  [ "$1" = "" ]  && return 0
  [ `pgrep -n -f $1` ] && return 1 || return 0
}

while [ 1 ]; do 
  # timestamp
  ts=`date +%T`
  NOW=`date +"%Y%m%d-%H%M%S"`

  # echo "$ts: begin checking..."
  check_process "wx_nanoserver"
  [ $? -eq 0 ] && echo "$ts: not running, restarting..." && `php /var/www/wx_nanoserver.php > /var/www/logs/wx_output_$NOW.log 2> /var/www/logs/wx_error_$NOW.log &`
  sleep 5
done
尝试:


如果您使用[],您将尝试检查pgrep标准输出数据,并且您的脚本没有将其与空白进行比较,或者如果没有[],则将使用pgrep退出代码。

您的脚本有两个奇怪的地方:

  [ `pgrep -n -f $1` ] && return 1 || return 0
通过副作用起作用。
``部分的计算结果要么是进程的pid(如果找到),要么是nothing(如果没有找到进程)。单个
[
符号是
test
内置(或早期系统上的命令)的同义词,如果其参数为非空字符串,则恰好返回
true
,如果没有参数,则返回
false
。因此,当找到pid时,该测试类似于
[1234]
,其计算结果为true和
[]`否则,它的计算结果为false。这确实是您想要的,但这样写会更简洁:

  pgrep -n -f "$1" &>/dev/null && return 1 || return 0
另一件事是

 `php /var/www/wx_nanoserver.php > /var/www/logs/wx_output_$NOW.log 2> /var/www/logs/wx_error_$NOW.log &`
在没有明显原因的情况下使用命令替换。您要求bash计算命令的输出,而不是简单地运行它。由于其输出被重定向,它总是计算为空字符串,因此不会产生进一步的影响。一个副作用是,命令在子shell中运行,这是一个取消命令名的好方法。尽管,这样写起来会更简洁:

 ( php /var/www/wx_nanoserver.php > /var/www/logs/wx_output_$NOW.log 2> /var/www/logs/wx_error_$NOW.log & )
不确定实际的问题可能是什么。不管怎么说,似乎是这样的


最后请注意,后面的勾号
``符号已被弃用,取而代之的是
$()`注释。

完全不用检查怎么样?只要命令退出,它就会重新开始。
为true;yourcommand;done
您可以随时将该循环放到后台。我已经根据这里的优秀建议更新了shell脚本。但它并没有解决问题。php脚本仍然以ma结尾几天后运行ny实例。对此有什么想法吗?在命令行中,您不能启动多个实例,因为它侦听一个端口,您会得到一个错误,即该端口上已经有一个侦听器……可能是除了一个之外,其他所有实例都崩溃了,但仍然是一个谜:pgrep仍然看到一个进程,不应该启动它疗法。
 ( php /var/www/wx_nanoserver.php > /var/www/logs/wx_output_$NOW.log 2> /var/www/logs/wx_error_$NOW.log & )