Shell脚本用于进程监控。

3

This

#!/bin/bash
if [ `ps -ef | grep "91.34.124.35" | grep -v grep | wc -l` -eq 0 ]; then sh home/asfd.sh; fi

这个还是这个?
ps -ef | grep "91\.34\.124\.35" | grep -v grep > /dev/null
if [  "$?" -ne "0" ]
then
sh home/asfd.sh
else
echo "Process is running fine"
fi

你好,请问如何编写一个Shell脚本,检查正在运行的进程,如果没有进程名包含91.34.124.35,则在特定位置执行一个文件,我希望将其每30秒运行一次,形成一个持续循环,我认为有一个睡眠命令。

9个回答

4

我知道在实现中最小的单位是一分钟,因此您无法使用cron。您可以使用sleep,但这样您的进程将始终运行(使用cron,它将在每次启动时启动)。

要使用sleep,只需:

while true ; do
  if ! pgrep -f '91\.34\.124\.35' > /dev/null ; then
    sh /home/asfd.sh
  fi
  sleep 30
done

如果你的pgrep-q选项来抑制输出(如在BSD上),你也可以使用pgrep -q而无需将输出重定向到/dev/null


+1;我认为你的逻辑是反过来了 - 用!前缀if条件语句。此外,通过使用pgrep(它始终排除自身)而不是ps + grep,可以简化if语句为:if ! pgrep -f '91\.34\.124\.35' > /dev/null; then - mklement0
@mklement0 哦,我没有注意到问题中的否定。我已经更正了我的答案。谢谢。 - Matteo
谢谢,但是在Linux上pgrep -q不起作用,所以我使用了> /dev/null重定向;另外,(a) 你需要使用-f来匹配整个命令行,而不仅仅是进程名称,(b) 当你使用pgrep时,你不需要[9]的技巧(pgrep默认不匹配自身);如果你再次更新,请在代码下面的项目符号中反映这些更改。 - mklement0
添加了-f选项,并注释了GNU/BSD版本。 - Matteo

2
首先,您应该能够将脚本简化为以下形式:
if ! pgrep "91\.34\.124\.35" > /dev/null; then ./your_script.sh; fi

为了每30秒运行一次cron任务(因为cron只能每分钟运行一次),您需要2个条目 - 一个用于运行命令,另一个在再次运行相同的命令之前延迟30秒。例如:
* * * * * root if ! pgrep "91\.34\.124\.35" > /dev/null; then ./your_script.sh; fi
* * * * * root sleep 30; if ! pgrep "91\.34\.124\.35" > /dev/null; then ./your_script.sh; fi

为了更加简洁,您可以先将命令存储在变量中,并在两个条目中使用它。(我没有测试过)。

CHECK_COMMAND="if ! pgrep '91\.34\.124\.35' > /dev/null; then ./your_script.sh; fi"

* * * * * root eval "$CHECK_COMMAND"
* * * * * root sleep 30; eval "$CHECK_COMMAND"

p.s. 上述内容假设您将其添加到/etc/crontab中。要在用户的crontab(crontab -e)中使用它,只需在命令之前省略用户名(root)即可。


1
我建议使用 watch:
watch -n 30 launch_my_script_if_process_is_dead.sh

0

试试这个:

if ps -ef | grep "91\.34\.124\.35" | grep -v grep > /dev/null
then
    sh home/asfd.sh
else
    echo "Process is running fine"
fi

不需要使用testif本身将检查退出代码。


稍微简单一点:if ps -ef | grep -q "[9]1\.34\.124\.35"; then ...。方括号可以帮助过滤掉结果中的grep进程。 - glenn jackman

0

您可以将脚本保存在文件名为myscript.sh的文件中

然后,您可以通过cron运行您的脚本

 */30 * * * * /full/path/for/myscript.sh

或者你可以使用 while

 # cat script1.sh
 #!/bin/bash
 while true; do /bin/sh /full/path/for/myscript.sh ; sleep 30; done &

 # ./script1.sh

谢谢。


0

我发现将关键脚本设置为守护进程非常有效。

http://cr.yp.to/daemontools.html

0

两种方式都可以,你可以将它保存在一个.sh文件中,并将其添加到crontab中以每30秒运行一次。如果你想知道如何使用crontab,请告诉我。


0

你可以使用monit来完成此任务。请参阅文档。它适用于大多数Linux发行版,并具有简单直观的配置。在此帖子中找到一些示例

对于你的应用程序,它会像这样:

check process myprocessname
    matching "91\.34\.124\.35"
    start program = "/home/asfd.sh"
    stop program = "/home/dfsa.sh"

如果您的平台上不可用monit,则可以使用supervisord

我还发现这个问题非常类似于在Linux中自动重复命令。它建议使用watch


-1

使用 cron 来完成“每30秒循环一次”的部分。


3
我认为分钟是cron表达式中最小的时间单位。 - glenn jackman
你说得对。http://www.linux-archive.org/centos/229078-cron-daemon-better-precision.html 因为提醒而加1个赞 :D - Kheldar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接