如果死了就开始进程

时间:2012-04-03 11:59:43

标签: linux bash process daemon

我想要做的是如果没有开始就开始一个过程。这是我尝试的

#!/bin/bash
pid=`ps ax | grep app | grep -v grep | wc -l`
  if [ $pid = 0 ]
then
 /etc/init.d/app start
fi

问题在于行

/etc/init.d/app start

未执行。这有什么不对? 我知道我可以使用daemontools,但我喜欢“bash”方法。

4 个答案:

答案 0 :(得分:3)

查看==运算符。

最好的可能是

pid=`ps ax | grep app | grep -v grep`
test -z "$pid" && /etc/init.d/app start

答案 1 :(得分:2)

您可以通过将关键字转换为与自身不匹配的正则表达式来避免双重grep。您可以使用grep -c而不是使用wc计算。在您的脚本中,您可以尝试:

pcount=`ps ax | grep -c "[a]pp"`

或者,使用实际的pid而不是进程计数:

#!/bin/bash

pid=`ps ax | awk '/[a]pp/{print $1}'`

if ! ps "$pid" >/dev/null; then
  /etc/init.d/app start
fi

请注意,这仍然是处理服务重新启动的非常糟糕的方法。你应该看看 app 是否维护了自己的pid文件,也许是/ var / run /中的某个地方,然后测试它的内容。

#!/bin/sh
if [ -f /var/run/app.pid ]; then
  if ps `cat /var/run/app.pid` >/dev/null; then
    /etc/init.d/app start
  fi
else
  /etc/init.d/app start
fi

甚至更好,使用daemontools runitupstart或类似的东西启动 app ,以便为您处理这些事情。

答案 2 :(得分:0)

如果你有GNU ps,这很简单,不需要任何疯狂。

if ! ps -C app >/dev/null ; then
     /etc/init.d/app start
fi

您只需要注意,传递给app的{​​{1}}是实际的流程名称。

答案 3 :(得分:0)

我现在无法检查我的服务器,但是Debian使用start-stop-daemon来加载服务,它似乎是用于您的任务的正确工具,因为它通过PID跟踪您的后台进程不只是匹配进程列表中的名称(也可以这样做)。