时时监控某一个进程,如果该进程不存在,即启动某个服务

liyi_boy 2010-07-20 09:26:20
各位高手达人、大哥、大姐:
开机启动linux,打开sh restart80.sh(java的web服务器)后,这个进程会经常突然死掉(进程消失不见,像被kill掉一样),导致web服务器停止,网站不能访问,找了很久原因也不知道是为什么,如何能做到时时的监控这个进程,如果这个进程死掉后马上自动启动restart80.sh这个web服务??帮帮小弟吧!头疼中
下面是刚启动 restart80.sh命令后出现的结果
[root@localhost root]# ps -ef|grep orion

root 20736 1 50 09:15 pts/0 00:00:25 /usr/java/jdk1.5.0_14/bin/java -showversion -Djava.awt.headless=true -Xms256M -Xmx2048M -XX:MaxPermSize=160m -server -jar orion.jar
...全文
983 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
believe1314 2010-09-07
  • 打赏
  • 举报
回复
用cfengine的process活动
steptodream 2010-07-20
  • 打赏
  • 举报
回复
ps -ef | grep orion | grep -v grep
我单独运行了句,什么都没有,下面是结果
-------------------
那就说明没有包含字符串orion的进程存在。

要不你就按6楼说的 去找个工具
liyi_boy 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 steptodream 的回复:]
ps -ef | grep orion | grep -v grep
这句就是检查包含orion的进程是否存在!
[/Quote]
我单独运行了句,什么都没有,下面是结果

[root@localhost root]# ps -ef | grep orion | grep -v grep
[root@localhost root]#
快乐田伯光 2010-07-20
  • 打赏
  • 举报
回复
楼主,有现成的东西可用,上网搜一下Monit吧
steptodream 2010-07-20
  • 打赏
  • 举报
回复
ps -ef | grep orion | grep -v grep
这句就是检查包含orion的进程是否存在!
steptodream 2010-07-20
  • 打赏
  • 举报
回复
但是,我将启起来的这个进程给kill掉的话,10秒后它不会将它重复启动
----------------
把哪个kill掉?
liyi_boy 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steptodream 的回复:]
要实时监控 有点不好搞 你最好找到他死掉的根本原因
下面这个简单的shell脚本 能满足里的最低要求 每10秒检查一次 把/path/换成你实际路径
如果死了就执行restart80.sh
如果你不想10秒检查一次 你可以把sleep 10去掉 但是我怕太平凡会浪费你太多cpu时间。
#vi check.sh
#!/bin/sh
while [ 1 ]
do
ps -ef | gr……
[/Quote]
我执行脚本后,如果restart80.sh没启起来,可以自动的将这个启动,但是,我将启起来的这个进程给kill掉的话,10秒后它不会将它重复启动
wwwunix 2010-07-20
  • 打赏
  • 举报
回复
给你个思路:
1、你的服务进程启动后,将进程号写到某个文件中。
2、另外写一个监控进程:从文件中读取进程号,然后定时检查该进程是否存在。
3、如果存在,则重复检查。
4、如果不存在,则重新启动进程(并将新的进程号替换到文件中),然后继续定时检查。
steptodream 2010-07-20
  • 打赏
  • 举报
回复
要实时监控 有点不好搞 你最好找到他死掉的根本原因
下面这个简单的shell脚本 能满足里的最低要求 每10秒检查一次 把/path/换成你实际路径
如果死了就执行restart80.sh
如果你不想10秒检查一次 你可以把sleep 10去掉 但是我怕太平凡会浪费你太多cpu时间。
#vi check.sh
#!/bin/sh
while [ 1 ]
do
ps -ef | grep orion | grep -v grep
test $? -eq 0 || /path/restart80.sh
sleep 10
done

#chmod +x check.sh
#nohup /path/check.sh &
luketty 2010-07-20
  • 打赏
  • 举报
回复
应该是运行程序的环境变量不对了,如熊猫兄所说 在启动脚本里加上环境变量

检测可以放在crontab里,不过检测频率不能精确到秒
steptodream 2010-07-20
  • 打赏
  • 举报
回复
我怀疑是不是java变量的问题
你java变量设置在哪儿的 比如是/etc/profile
在那个监视脚本里加一句
#!/bin/sh
source /etc/profile
while [ 1 ]
do
ps -ef | grep orion | grep -v grep
test $? -eq 0 || /root/restart80.sh
sleep 10
done
steptodream 2010-07-20
  • 打赏
  • 举报
回复
那你刚才说两个都不存在了?

chmod +x /root/restart80.sh

再看看

我按13楼那样都测试了的 真是奇怪了!
liyi_boy 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 steptodream 的回复:]
你不能把check.sh给终止了 让他一直在后台执行
check.sh都停止了 他还怎么检查啊 当然不能启动成功了
你这样运行check.sh
#nohup /path/check.sh &
[/Quote]
哈,我没有停check.sh,我kill的是orion,现在的情况kill掉orion以后check.sh还存在,但是不会自动的将restart80.sh启起来
steptodream 2010-07-20
  • 打赏
  • 举报
回复
你不能把check.sh给终止了 让他一直在后台执行
check.sh都停止了 他还怎么检查啊 当然不能启动成功了
你这样运行check.sh
#nohup /path/check.sh &
liyi_boy 2010-07-20
  • 打赏
  • 举报
回复
附上我cat出来的check.sh文件
[root@localhost root]# cat check.sh
#!/bin/sh
while [ 1 ]
do
ps -ef | grep orion | grep -v grep
test $? -eq 0 || /root/restart80.sh
sleep 10
done
liyi_boy 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 steptodream 的回复:]
我执行脚本后,如果restart80.sh没启起来,可以自动的将这个启动,
但是,我将启起来的这个进程给kill掉的话,10秒后它不会将它重复启动
---------------------
用进程名字判断就OK

你把起来的这个进程给kill掉之后
执行ps -ef | grep orion | grep -v grep
看看此时orion进程还在不在?
再看看此时check……
[/Quote]
两个都不存在了
steptodream 2010-07-20
  • 打赏
  • 举报
回复
另外我把程序改成
#!/bin/sh
while [ 1 ]
do
ps -ef | grep httpd | grep -v grep
test $? -eq 0 || /etc/init.d/httpd start
sleep 10
done

然后无论httpd没启动 还是被我kill掉 都能把httpd启动了
是好用的
steptodream 2010-07-20
  • 打赏
  • 举报
回复
我执行脚本后,如果restart80.sh没启起来,可以自动的将这个启动,
但是,我将启起来的这个进程给kill掉的话,10秒后它不会将它重复启动
---------------------
用进程名字判断就OK

你把起来的这个进程给kill掉之后
执行ps -ef | grep orion | grep -v grep
看看此时orion进程还在不在?
再看看此时check.sh还在不在
ps -ef | grep check | grep -v grep
liyi_boy 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 coder_granger 的回复:]
最好不要只根据进程号判断进程是否仍然存在,
因为进程退出后,进程号可能分配给其它新建的进程,
必须结合进程名字或者其它信息判断.
[/Quote]
如何结合进程名字或者期它信息判断,麻烦看一下,我描述问题里面写得还比较细
Coder_Granger 2010-07-20
  • 打赏
  • 举报
回复
最好不要只根据进程号判断进程是否仍然存在,
因为进程退出后,进程号可能分配给其它新建的进程,
必须结合进程名字或者其它信息判断.
加载更多回复(1)

19,613

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧