Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于进程监视的Shell脚本_Linux_Shell - Fatal编程技术网

Linux 用于进程监视的Shell脚本

Linux 用于进程监视的Shell脚本,linux,shell,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 您好,我如何编写一个shell脚本来查看正在运行的进程,如果没有一个进程名包含91.34.124.35,那么在某个地方执行一个文件,我想在一个连续循环中每30秒运行一次,我想有一个sleep命令 对“每30秒循环一次”部分使用cron。任何一种方法都可以,您可以将其保存在

这个

还是这个

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

您好,我如何编写一个shell脚本来查看正在运行的进程,如果没有一个进程名包含91.34.124.35,那么在某个地方执行一个文件,我想在一个连续循环中每30秒运行一次,我想有一个sleep命令

对“每30秒循环一次”部分使用cron。

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

试试以下方法:

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

无需使用
测试
if
本身将检查退出代码。

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

仅仅利用睡眠

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

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

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

while true ; do
  if ! pgrep -f '91\.34\.124\.35' > /dev/null ; then
    sh /home/asfd.sh
  fi
  sleep 30
done
要通过cron每30秒运行一次(因为cron仅每分钟运行一次),您需要两个条目—一个用于运行命令,另一个用于在再次运行同一命令之前延迟30秒。例如:

if ! pgrep "91\.34\.124\.35" > /dev/null; then ./your_script.sh; fi
要使其更简洁,您可以首先将命令存储在变量中,并将其用于两个条目。(我还没有测试过这个)



p、 以上假设您正在将其添加到
/etc/crontab
。要在用户的crontab(
crontab-e
)中使用它,只需在命令之前省略用户名(
root
)。

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

然后可以通过cron运行脚本

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"
或者你可以在

 */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

我发现取消批评脚本的名字非常有效

watch -n 30 launch_my_script_if_process_is_dead.sh

您可以使用
monit
执行此任务。它在大多数linux发行版上都可用,并且具有简单的配置。找到一些

对于你的应用程序,它看起来像

http://cr.yp.to/daemontools.html
如果在您的平台上不可用,您可以使用


我也发现这个问题非常相似。建议使用
监视

简单一点:
如果ps-ef | grep-q“[9]1\.34\.124\.35”;然后…
。方括号有助于从结果中过滤出grep过程。我认为分钟是cron的最小粒度。你说得对+1提请注意:D+1;不过,我认为您的逻辑是反向的——在
if
条件前面加上
。此外,通过使用始终排除自身的
pgrep
,而不是
ps
+
grep
if
语句可以简化为:
if!pgrep-f'91\.34\.124\.35'>/dev/null;然后
@mklement0是的,我没有注意到这个否定。我更正了我的答案。谢谢,但是不幸的是,
pgrep-q
在Linux上不起作用;因此,我的
/dev/null
重定向;此外,(a)您需要
-f
以匹配整个命令行,而不仅仅是进程名称,以及(b)使用
pgrep
时不需要
[9]
技巧(默认情况下,
pgrep
本身不匹配);如果您再次更新,请同时反映代码下面的要点中的更改。添加了-f并对GNU/BSD版本发表了评论
http://cr.yp.to/daemontools.html
check process myprocessname
    matching "91\.34\.124\.35"
    start program = "/home/asfd.sh"
    stop program = "/home/dfsa.sh"