我想要做的是如果没有开始就开始一个过程。这是我尝试的
#!/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”方法。
答案 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 runit或upstart或类似的东西启动 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跟踪您的后台进程不只是匹配进程列表中的名称(也可以这样做)。