在*nix机器上检测某进程的生死

原创
2014/10/09 17:15
阅读数 212

    公司有个斗地主的手游项目.服务端是我写的.那个机器人有某些bug会导致运行中死掉.问题是在本地测试的时候没有死过,放到云服务器上,就会在运行一段时间后悄无声息的死掉.日志只有一条让人摸不到头脑的错误码.(还是我自定义的错误码%>_<%)

    在找到这个闹心的bug(也许是好几个bug)前,就要先出一个快速的补救措施.

    下面切换到问答模式:

    A: xxx,你这个斗地主没有AI吗?

    B: 有啊!就是机器人因为某些诡异的我还知不道的原因老死掉,所以是吧

    A:难道你让我跟老板说你这个机器人老死吗?

    B:怎么可以说我的程序有这么严重的bug!

    A:那你说怎么办!!!

    B:这个,这个,bug好难找哇……

    A:你就不能让机器人死了的时候重启自己吗?

    B:槟狗!你说的怎么这么对!

    A:是不是发现你已经完成95%的工作了.剩下的5%交给你去写代码了.哼哼!

    B:你胸前的红领巾更加鲜艳了呢!


如上,解决思路很简单."在进程死掉后,重新启动进程"

那么,直接的我能想到的就是一个监视进程,它去窥探需要监视的那个进程是否还活着.

哎,一切都理清了.

原理:

在*nix系统里面.一个在运行的进程会在/proc下生成一个用进程号命名的文件夹.如果进程关闭,这个文件夹就不存在了.所以只要查询这个文件夹存在与否就好了.

机智的我在机器人进程里面获取pid然后写入/var/run/的某个文件里面

在监视的进程里面每隔那么一段时间检测一下.哈哈.搞定!上代码:

#!/bin/bash

robotpidf=/var/run/ddzrobot2.pid

checkrobot()
{
	#判断是否存在pid文件, 如果存在就读取并判断在/proc是否存在该目录,不存在说明已经死亡
	if !([ -f ${robotpidf} ] && [ -e /proc/$(cat ${robotpidf}) ]);then
		(python robot2.py &)
	else
		echo '正常'
	fi
}


while [[ 1 ]]; do
	#首先检测服务器进程是否已经启动
	if [ $(ps -ef | grep 'python .* gate' | wc -l) -gt 1 ];then 
		checkrobot
	else
		echo '服务未启动'
		exit 0
	fi
	sleep 60
done


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部