用于检查进程是否正在运行的Shell脚本

时间:2014-07-01 02:00:10

标签: linux bash shell cron

有一些奇怪的行为导致我认为可能会发生一些事情......

所以我有一个由cron执行的shell脚本。基本上它是为了检查Node.js是否正在运行。如果是这样,请记录日期......如果没有,则记录下来!在我构建它的时候,我测试了它,并在节点脚本运行时看到它被记录,并且在它停止运行时没有记录...

最近我知道Node失败了,并认为这是检查脚本是否按照预期做的完美机会。它没有!它 ...... :(

这是脚本:

#!/bin/bash

if ps -Al | grep -v grep | grep -q node 
then
        date > /etc/nodeCheck.log 
else
        date > /dev/null 
fi

此.sh的权限是正确的,使用的路径存在,正在运行

$ps -A | grep -v grep | grep -q node

什么都不返回

$echo $?
1

所以不应该去else块吗? node是启动后启动的进程。当我在SSH上运行时,shell脚本在由cron运行时都无法正常工作。

我错过了一些基本的东西吗?

TIA

尼科

3 个答案:

答案 0 :(得分:1)

除非您正在运行BSD ps,否则您应该可以使用-C标记或pgrep

-C cmdlist      Select by command name. This selects the processes whose executable 
                name is given in cmdlist.

例如,

if ps -C node > /dev/null
then
        date > /etc/nodeCheck.log 
else
        date > /dev/null 
fi

if pgrep node > /dev/null
then
        date > /etc/nodeCheck.log 
else
        date > /dev/null 
fi

答案 1 :(得分:1)

这不是你问题的答案,但也许这是你问题的解决方案。

我在Node中遇到的一个问题是服务器进程没有在任何地方存储它的pid。因此,我没有让cron运行以“检查”它是否正在运行,而是将node可执行文件包装在一个脚本中,只要它崩溃就会重新启动它。

#!/bin/sh

cd /path/to/my/software

while sleep 1; do
  date '+%Y-%m-%d %T - nodejs restarted' 
  logger "nodejs restarted"; date '+%Y-%m-%d %T - nodejs restarted' | Mail -v -s "nodejs restarted on `hostname -s`" admin@example.com
  node main.js
done

当系统启动时,此脚本将运行 。它启动Node,如果Node永远不会崩溃,一切都很好,但如果确实如此,我会收到通知,日志条目和重启。

我在FreeBSD中运行它,但它应该在Linux或其他操作系统中运行良好。

答案 2 :(得分:0)

按名称检查流程的另一种方法:

if killall -s 0 node &>/dev/null; then
    ...

或者,如果shell不支持&>

if killall -s 0 node >/dev/null 2>&1; then