有一些奇怪的行为导致我认为可能会发生一些事情......
所以我有一个由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
尼科
答案 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