如果找不到则检查进程并重新启动程序的脚本[重复]

Posted

技术标签:

【中文标题】如果找不到则检查进程并重新启动程序的脚本[重复]【英文标题】:Script to check for process & restart program if not found [duplicate] 【发布时间】:2016-09-26 21:35:15 【问题描述】:

我正在使用这个检查脚本来查看一个名为 CCcam 的包是否正在运行,如果没有运行则重新启动它..

#!/bin/sh 
process=`ps auxwww | grep CCcam | grep -v grep | awk 'print $1'`
if [ -z "$process" ]; then
echo "Couldn't find CCcam running. Restarting server-binary" >> /var/cccamlog/cccam.check 
echo && date >>/var/cccamlog/cccam.check
/usr/local/bin/CCcam -d >> /var/cccamlog/CCcam.log & 
else echo "CCcam is still OK!" >> /var/cccamlog/cccam.check 
fi 

脚本报告“CCcam 仍然正常!”

但它没有运行,如果我使用这个命令搜索进程: ps x |grep -v grep |grep -c CCcam,我得到 0,所以我知道进程没有运行。

是否还有其他我应该考虑的因素可能会使检查脚本误以为 CCcam 正在运行?例如,在程序崩溃/停止后是否会留下某种类型的标签,而脚本正在接受这些标签?

从另一个测试我得到.. 错误:CCcam 仍然使用 pid 运行:

【问题讨论】:

你可以用 grep 搜索 grep [C]Ccam 而不是 grep -v grep。此表达式不会匹配自身。 更好,pgrep CCcam 好的,我会同时尝试它们。从我得到的另一个测试脚本中...... 当你打开 shell 调试功能时,调试你的代码正在做的事情要容易得多。 set -x 将向您显示每一行替换变量的值。 set -vx 有点冗长,但可能会令人困惑(与set -x 不同的方式;-)。我想如果你使用调试,你会看到一些不应该存在的东西被设置到 $process 中。此外,awk 可以匹配模式,因此取出所有 grep 并使用 | awk '/[C]Ccam/print $1'。祝你好运。 对不起,伙计们,但我不知道如何在我的脚本中实现你给我的答案,我的 linux 目前很差.. 【参考方案1】:

在这种情况下,您也可以使用pgrep。它在 proc 表中查找进程名称 CCCam。

if [[ $(pgrep CCCam) ]]; then
   echo "CCCam is running";
else
   echo "Not Running, so I must do something";
   # DO something ....
fi

【讨论】:

这个答案太好了,我现在得了糖尿病。【参考方案2】:
if pidof -s CCCam > /dev/null; then
    echo 'It is already running!'
else
    echo 'process not found...'
fi

【讨论】:

以上是关于如果找不到则检查进程并重新启动程序的脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP会话系统脚本重新加载页面没有消息[重复]

shell习题第13题:监控nginx进程

linux下httpd进程cup 100% kill了进程还是自动重启,/proc/pid/exe也找不到该进程的执行文件

为啥电脑windowsXP启动界面后又重复启动

多个文件存在检查?更好的方法?

如何使用批处理文件以管理员权限结束进程