【问题标题】:Shell script to check if process is running用于检查进程是否正在运行的 Shell 脚本
【发布时间】:2014-08-21 11:50:44
【问题描述】:

发生了一些奇怪的行为,让我认为可能发生了什么事......

所以我有一个由 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 运行时,无论是由 cron 运行还是由我运行,shell 脚本都无法正常工作。

我在这里遗漏了一些基本的东西吗?

TIA

尼可

【问题讨论】:

  • 仅供参考,您可以将两个greps 合并为grep -q '[n]ode'
  • 尝试删除-q。如果它匹配任何内容,它将显示它,cron 会将输出邮寄给您。
  • 你可以检查ps -A 的输出,如果它确实显示了所有用户的进程。如果不是,则问题在您的进程ps 的权限范围内。
  • @konsolebox 如何查看ps的权限范围?我可以告诉你,当我在ps 中进行 SSH 时,不会显示启动后由 rc.local 启动的节点进程,但 ps -A 会显示它
  • 您实际上可能过快地杀死和检查您的节点。尝试在它们之间插入睡眠。一些进程会在退出前捕获 SIGTERM 信号并进行清理。

标签: linux bash shell cron


【解决方案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

【讨论】:

  • 我喜欢这个pgrep 的想法。我喜欢所有的想法。
【解决方案2】:

这并不完全是您问题的答案,但也许它是您问题的解决方案。

我在使用 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 或其他操作系统中同样运行良好。

【讨论】:

  • 我喜欢这个主意。
【解决方案3】:

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

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

或者如果shell不支持&>:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2019-03-10
    • 2010-10-21
    相关资源
    最近更新 更多