用于进程监视的Shell脚本

时间:2011-08-26 15:41:34

标签: linux shell

#!/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脚本,如果没有进程名称 CONTAINING 91.34.124.35,那么在某个地方执行一个文件,我想制作一个这个连续循环每30秒运行一次,我认为有一个睡眠命令。

8 个答案:

答案 0 :(得分:3)

你不能使用cron因为在实现中我知道最小的单位是一分钟。你可以使用sleep但是你的进程总是在运行(每次都会启动cron。)

仅使用睡眠

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 :(得分:1)

首先,您应该能够将脚本简化为

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

要通过cron每30秒运行一次(因为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)。

答案 2 :(得分:1)

我建议使用watch

watch -n 30 launch_my_script_if_process_is_dead.sh

答案 3 :(得分:0)

使用cron进行“每30秒循环”部分。

答案 4 :(得分:0)

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

答案 5 :(得分: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本身将检查退出代码。

答案 6 :(得分:0)

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

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

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

或者您可以使用

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

 # ./script1.sh

感谢。

答案 7 :(得分:0)

我发现非常有效的deamonizing关键脚本。

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