服务程序崩溃自动重启后自动重启可行吗

|  
|  
|  
|  
|  
只需一步,快速开始
查看: 4097|回复: 30
COD6服务端自动重启批处理,方便程序异常关闭后,自动重启。
主题帖子积分
高级玩家, 积分 347, 距离下一级还需 253 积分
高级玩家, 积分 347, 距离下一级还需 253 积分
本帖最后由 fanfeng3000 于
19:16 编辑
网上搜索到,特转给有需要的开服务端的人士。
第一种:不显示批处理框且没有进 程
if %1.==. mshta vbscript:createobject(&wscript.shell&).run(&&&%~f0&&
h&,0)(close)&exit/b
&E:\call of duty modern warfare 2\iw4mp.dat&
第二种:显示批处理框
start /wait /d &E:\call of duty modern warfare 2\& iw4mp.dat
--------------------------
一台电脑开几个服务端,建议不要把iw4mp.dat名字写成一样.
多开分别写个多个批处理*.bat.
请大家验证下是否有帮助。
主题帖子积分
侦探男爵夫人+永远的St.Tail世界
贡献度1088
本帖最后由 ARX-4 于
23:27 编辑
额,好长时间没来COD7版块了,竟然发现在讨论服务器端啊。。据说现在NTA又更新AIW的服务器补丁了,是服务器端的补丁,版本是0.3c,貌似是对网速带宽的限制,不过我也没折腾了。。仍然在苦等AlterOps中。。
声明地址见:
下载地址见:
主题帖子积分
侦探男爵夫人+永远的St.Tail世界
贡献度1088
本帖最后由 ARX-4 于
23:28 编辑
万恶的IE9又二连了。。。。。。。。。。
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
& & win7需要用用管理员身份运行么【不这样的话就出错了
主题帖子积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
为什么我在用你的服务端管理软件的时候,不管是0.83还是0.90,都会把服务端搞崩溃呢?不用这个软件服务端反 ...
intgl 发表于
& &123=456
软件只是检查服务器是否在运行,没有运行就是用启动参数运行程序,根本不会干涉到服务端的运作,任何情况下,都不会因为我的软件导致服务端工作不正常.
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
本帖最后由 intgl 于
10:35 编辑
为什么我在用你的服务端管理软件的时候,不管是0.83还是0.90,都会把服务端搞崩溃呢?不用这个软件服务端反倒没问题,难道我的设置文件出问题了?
每当服务器换图的时候,就很有可能崩溃…………
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
& & 这个用户名密码的设置是怎样的?比如账号123,密码456
//管理员,用户名不能超过8个字符,密码不能超过12个字符. 格式: admin=password
password=456
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
& & 灰常感谢~!!
主题帖子积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
00:29 上传
点击文件名下载附件
23.69 KB, 下载次数: 84
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
已经在用最新服务器端了,但是求好的服务器管理软件比如21楼的
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
大哥求下载!求地址!
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
呃,去哪下载呢
主题帖子积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
本帖最后由 caoping 于
00:07 编辑
tasklist|findstr /i &iw4mp.dat& ||start && &iw4-联机服务器[AIZombie 1.5 beta]建立!.bat&
ping 12 ...
intgl 发表于
& &看到里面有我的回帖吓了我一跳,2月份的帖子都被你挖出来了,真厉害.
现在我用的自己写的cod6服务器监控程序,方便多了.
未命名.jpg (181.17 KB, 下载次数: 0)
00:07 上传
EGA-COD6服务器守护程序
制作:cAop!ng
上海浦东新区电子竞技社
最初主要目的是为了服务器程序崩溃后能自行启动.后来逐渐加入补充功能.
如果程序启动无响应,请确保Monitor.ini文件在程序目录,并且文件录入正确.
拷贝执行程序到服务器程序主目录,并每设定秒数查询一次服务器状态,如服务器消失则启动服务器,如服务器失去响应或者出错,则强行关闭服务器程序,25+秒后重启服务器.
等服务器启动完毕后,自动开始处理服务器数据.每设定秒数读取服务器内存,获得并格式化玩家数据,对比玩家GUID是否在banlist.txt文件中.如是,则自动ban掉.对比玩家的ip头两位数字是不是在iplist.txt里有记录,如是,则自动ban掉.
加入网页管理登录功能,脱离以前版本需要客户端软件的麻烦,现在只要能开网页就可以登录查看服务器状态和进行管理.
加入当前服务器地图识别,可以在网页上看到当前服务器正在进行的地图缩略图.
修改击杀数和死亡数的读取位数,避免过去超过255后,数据错误的问题.
修改服务器上限为10.
加入防止重复喊话判定(未证实).
加入服务器客户端模式.
加入设定各线程工作间隔时间.
重新定义刷新线程.
加入log记录级别功能.
加入服务器开关功能,适应偶尔不开某服务器需要
加入读取ini配置文件功能.
加入log记录功能.
修改部分核心代码,为网络化做准备.
去掉必须手动开始文本处理的,现在只需要选择开始监控就可以了.
加入粗略步骤汇报,好知道现在程序正处于什么状态.
加入宕机后停掉文本处理步骤,并额外延时时间,尝试避免服务器重启后会爆卡的问题.
加入发送指令后直接生效的功能,避免等待.
避免ID为双字节编码导致的程序出错.
避免数据文件超过4096后,增加的数据无效的错误.
数据处理线程中加入归零操作,防止踢最后一名导致的重复踢人喊话错误.
增强数据判断,避免程序出错
重新定义一部分局部变量,避免数据污染的问题,以后再不能这么犯傻了.
重新定义读取文件步骤,避免读写文件失败错误.
解决0号玩家数据处理问题.
修正处理数据时,会因为一段错误的数据在游戏里喊话吓人.
加入屏蔽ip段功能,判断非常粗糙,误伤严重,慎用慎用.
加入自动ban人游戏内Op提示,根据wolveszyk的意见,加入设置线程间隔时间为20秒(默认),40秒,60秒三种,以对应可能会卡的服务器.
加入本地banlist.txt,根据GUID自动ban掉符合数据玩家,形成永久ban效果.
格式化游戏Log,分析玩家数据,加入鼠标菜单踢人ban人功能,管理更方便.
加入识别服务器程序失去响应后,自动关闭服务器,自动重启.
加入读取游戏Log
基本的服务器守护功能测试.
(149.85 KB, 下载次数: 0)
00:06 上传
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
本帖最后由 intgl 于
23:11 编辑
tasklist|findstr /i &iw4mp.dat& ||start && &iw4-联机服务器[AIZombie 1.5 beta]建立!.bat&
ping 127.1 -n 3 &nul
这是我找到并修改后的代码,100%可用!!
第二行的【【start && &iw4-联机服务器[AIZombie 1.5 beta]建立!.bat&】】的最后一对双引号内程序【我的是bat文件】,可以改成启动服务器的批处理或者快捷方式。
复制代码为bat文件放在服务端文件夹内。
第三行【ping 127.1 -n 3 &nul】里面的那个3,是每隔3秒查看服务器进程是否存在。呃,这个尽量设定的久一些,比如30.
呼……求人不如求己啊!!!
主题帖子积分
NS/Maver Intgl
游戏达人, 积分 2636, 距离下一级还需 864 积分
游戏达人, 积分 2636, 距离下一级还需 864 积分
批处理文件没用啊,求解啊,我WIN7 x64
主题帖子积分
中级玩家, 积分 190, 距离下一级还需 60 积分
中级玩家, 积分 190, 距离下一级还需 60 积分
卡住了进程CPU占用率很低吧
主题帖子积分
游戏狂人, 积分 1098, 距离下一级还需 902 积分
游戏狂人, 积分 1098, 距离下一级还需 902 积分
地图列表可定时正常的
因为5个服务器工作是正常的
但是经常出现读取下一个地图的时候,卡那里了!
其实大家可以留意看看,全国的服务器,有几个没有挂过??
主题帖子积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
肯定是放到了main目录里面了,不过最多只能读出你设置的服务器名字,其他设置都出不来……
我是用的 ...
wolveszyk 发表于
最简单的方式:找朋友弄个steam帐号,下载到正版客户端,然后去alterIWnet下载小小的服务器覆盖文件即可,什么毛病都没有
如果能读出服务器名的话,你看看是不是你的server.cfg内容有错误,可以复制贴出来看看
主题帖子积分
高级玩家, 积分 417, 距离下一级还需 183 积分
高级玩家, 积分 417, 距离下一级还需 183 积分
server.cfg放到main目录即可,我也被整了很久
caoping 发表于
& & 肯定是放到了main目录里面了,不过最多只能读出你设置的服务器名字,其他设置都出不来……
我是用的一个绿色版的COD6汉化版,然后再加些AIW联机补丁做的服务器端,里面乱七八糟的,有问题很正常
主题帖子积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
程序很少挂掉,基本上95%的情况是等待状态,就是等人那种状态,就是18人在线服务器也不进行读图。这时候如 ...
a9core 发表于
& &这个应该是地图列表没有设置
主题帖子积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
服务器宕有三种情况
3,脚本溢出
我还以为只有我一个人碰到了,哈哈
那么我想想办法吧.
主题帖子积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
游戏狂人, 积分 1002, 距离下一级还需 998 积分
我这个人懒,现在每次开服务器都是手工输入的命令,server.cfg始终有错,除了服务器名字,其他设置都不能载 ...
wolveszyk 发表于
& &server.cfg放到main目录即可,我也被整了很久
主题帖子积分
超级玩家, 积分 837, 距离下一级还需 163 积分
超级玩家, 积分 837, 距离下一级还需 163 积分
膜拜各位大大......
主题帖子积分
高级玩家, 积分 417, 距离下一级还需 183 积分
高级玩家, 积分 417, 距离下一级还需 183 积分
我这个人懒,现在每次开服务器都是手工输入的命令,server.cfg始终有错,除了服务器名字,其他设置都不能载入……,应该是我用的COD6的版本问题,懒得重下了。反正有空就远程看下,挂了就重启。
前段时间还很稳定,有一周多时间都没掉过一次,就是这几天经常挂……
主题帖子积分
游戏狂人, 积分 1304, 距离下一级还需 696 积分
游戏狂人, 积分 1304, 距离下一级还需 696 积分
没有弹出框的就不太好解决了。
主题帖子积分
游戏狂人, 积分 1098, 距离下一级还需 902 积分
游戏狂人, 积分 1098, 距离下一级还需 902 积分
cod6_server_bad.JPG (16.81 KB, 下载次数: 0)
这是一种错误
21:49 上传
这是一种错误
主题帖子积分
游戏精英, 积分 4777, 距离下一级还需 4223 积分
游戏精英, 积分 4777, 距离下一级还需 4223 积分
& & 试过CS时代的监测程序网络状态,但是失败了
主题帖子积分
游戏狂人, 积分 1098, 距离下一级还需 902 积分
游戏狂人, 积分 1098, 距离下一级还需 902 积分
关键是,服务器停止后(程序还在,就是不能进行下一个地图,卡那里了),没有任何弹出框,所以说,服务器挂了是经常的
主题帖子积分
游戏狂人, 积分 1304, 距离下一级还需 696 积分
游戏狂人, 积分 1304, 距离下一级还需 696 积分
那就写个程序检测下,如果弹出提示就重启服务端呗
主题帖子积分
打完这场仗,我就回老家结婚
贡献度6054
金元129860
不管怎样。感谢分享
您需要登录后才可以回帖
3DM死忠专属勋章
不思議の國
おかしな国へようこそ!
终身荣誉勋章
由管理员直接授予,历史上对3DM论坛做出过巨大贡献,会员最高荣誉
中秋活动勋章
蒹葭汉化组
蒹葭汉化组
Powered by使用ACE监控启动进程,进程崩溃后自动重启(windows/linux通用)
//使用ACE监控启动进程,进程崩溃后自动重启(windows/linux通用)
监护程序使用子进程的方式启动各个进程,
子进程退出时,监护程序能够得到相应的退出信号,
从而在子进程退出后,在重新启动相应的子进程。
//----------------------------------------------------------
//配置文件ProcessManager.conf格式
//./PROCESS_MANAGER 1
//./PROCESS_MANAGER 2
//----------------------------------------------------------
// main.cpp
// main.cpp
#include &CProcessManager.h&
int main(int argc, char *argv[])
// Running as a child for test.
if (argc & 1)
ACE_OS::sleep(10);
// set output log file
ACE_OS::setprogname(&ProcessManager&);
ACE_Date_Time tvTime(ACE_OS::gettimeofday());
char szLogFileName[256];
memset(szLogFileName, 0, sizeof(szLogFileName));
snprintf(szLogFileName, sizeof(szLogFileName), &log/%s_%04d%02d%02d_%02d%02d%02d.log&,
ACE_OS::getprogname(),
(int)tvTime.year(), (int)tvTime.month(),
(int)tvTime.day(),
(int)tvTime.hour(), (int)tvTime.minute(), (int)tvTime.second());
ACE_OSTREAM_TYPE *pLogOutput = new ofstream(szLogFileName);
ACE_LOG_MSG-&msg_ostream(pLogOutput, true);
ACE_LOG_MSG-&set_flags(ACE_Log_Msg::OSTREAM);
// Prepends timestamp and message priority to each message
ACE_LOG_MSG-&set_flags(ACE_Log_Msg::VERBOSE_LITE);
//ACE_LOG_MSG-&clr_flags(ACE_Log_Msg::STDERR);
ACE_DEBUG((LM_INFO, ACE_TEXT(&[%N:%l]: ---ProcessManager START---.\n&)));
int nRet = 0;
CProcessManager *pProcMng = new CProcessManager();
// 启动进程监控
nRet = pProcMng-&ProcessMonitor();
if(nRet != 0)
ACE_DEBUG((LM_ERROR, ACE_TEXT(&[%N:%l]: ---ProcessMonitor Error---\n&)));
delete pProcM
ACE_DEBUG((LM_INFO, ACE_TEXT(&[%N:%l]: ---ProcessManager STOP---.\n&)));
ACE_LOG_MSG-&clr_flags(ACE_Log_Msg::OSTREAM);
delete pLogO
头文件CProcessManager.h
类的定义如下
//CProcessManager.h
#include &stdio.h&
#include &stdlib.h&
#include &vector&
#include &string&
#include &map&
#include &ace/OS.h&
#include &ace/streams.h&
#include &ace/Log_Msg.h&
#include &ace/Date_Time.h&
#include &ace/Event_Handler.h&
#include &ace/Reactor.h&
#include &ace/Process_Manager.h&
// 进程监控,进程崩溃后,自动重新启动进程
class CProcessManager
CProcessManager(){};
virtual ~CProcessManager(){};
// 从配置文件读取进程列表信息
virtual int ReadConfigProcessInfo(char *pFileName);
// 启动进程,并进行进程监控,进程崩溃后,自动重新启动进程
virtual int ProcessMonitor();
vector&string& m_vConfigProcessI
// 进程列表信息
// 回调事件,程序退出后,执行handle_exit函数
class CProcessExitHandler: public ACE_Event_Handler
CProcessExitHandler(){};
virtual ~CProcessExitHandler(){};
// 程序退出后,执行该函数
virtual int handle_exit(ACE_Process* process);
//CProcessManager.cpp类中函数的实现
//实现自动重新启动进程
//CProcessManager.cpp
#include &CProcessManager.h&
ACE_Process_Manager *g_pPM;
// 进程管理
map&string, pid_t& g_mapProcessI
// 进程ID管理列表
// 读取进程列表配置文件
int CProcessManager::ReadConfigProcessInfo(char *pFileName)
char *pTemp = NULL;
char szTemp[1024];
string strTemp = &&;
if(NULL == pFileName)
ACE_DEBUG((LM_ERROR, ACE_TEXT(&[%N:%l]: Parameter FileName is null.\n&)));
return -1;
// 文件格式
//./PROCESS_MANAGER 1
//./PROCESS_MANAGER 2
// 打开进程列表配置文件
FILE *fp = fopen(pFileName, &r&);
if(NULL == fp)
ACE_DEBUG((LM_ERROR, ACE_TEXT(&[%N:%l]: file open error.[%s]\n&), pFileName));
return -2;
// 循环读取进程列表配置文件
memset(szTemp, 0, sizeof(szTemp));
pTemp = fgets(szTemp, sizeof(szTemp), fp);
if(NULL == pTemp)
// 去掉注释
if(szTemp[0] == '#')
strTemp = szT
if(strTemp.length() == 0)
// 去掉回车换行
if(strTemp[strTemp.length() - 1] == '\n')
strTemp[strTemp.length() - 1] = 0;
if(strTemp.length() == 0)
if(strTemp[strTemp.length() - 1] == '\r')
strTemp[strTemp.length() - 1] = 0;
if(strTemp.length() == 0)
// 把读取的进程信息放到[进程列表信息]全局变量
m_vConfigProcessInfo.push_back(strTemp);
// 关闭进程列表配置文件
fclose(fp);
// [进程列表信息]不应该为0
if(m_vConfigProcessInfo.size() == 0)
ACE_DEBUG((LM_ERROR, ACE_TEXT(&[%N:%l]: Process list is null.[%s]\n&), pFileName));
return -3;
// 进程监控
// 根据配置文件启动进程,并注册进程退出时回调函数
int CProcessManager::ProcessMonitor()
int nRet = 0;
vector&string&::iterator itrC
string strStartP
m_vConfigProcessInfo.clear();
// 读取进程列表配置文件
nRet = ReadConfigProcessInfo(&ProcessManager.conf&);
if(nRet != 0)
ACE_DEBUG((LM_ERROR,
ACE_TEXT(&[%N:%l]: ReadConfigProcessInfo[%s] error.\n&), &ProcessManager.conf&));
return -1;
// Instantiate a process manager with space for 100 processes.
g_pPM = new ACE_Process_Manager(ACE_Process_Manager::DEFAULT_SIZE, ACE_Reactor::instance());
CProcessExitHandler procExitH
// 循环配置进程列表,启动进程
for(itrConfig = m_vConfigProcessInfo.begin(); itrConfig != m_vConfigProcessInfo.end(); ++itrConfig)
strStartProcess = *itrC
// 启动进程
ACE_Process_O
mand_line(strStartProcess.c_str());
pid_t pid = g_pPM-&spawn(options);
// 启动进程失败
if (pid == ACE_INVALID_PID)
ACE_DEBUG((LM_ERROR,
ACE_TEXT(&[%N:%l]: start a child process success(%d)%s\n&),
pid, strStartProcess.c_str()));
return -1;
ACE_DEBUG((LM_INFO,
ACE_TEXT(&[%N:%l]: start a child process success(%d)%s\n&),
pid, strStartProcess.c_str()));
// 注册回调(进程退出时,调用该回调)
g_pPM-&register_handler(&procExitHandler, pid);
// 添加启动成功的进程到进程ID管理列表
g_mapProcessInfo[strStartProcess] =
ACE_OS::sleep(1);
// Run the reactor event loop waiting for events to occur.
ACE_Reactor::instance()-&run_reactor_event_loop();
//ACE_Reactor::instance()-&end_reactor_event_loop();
// 进程退出回调函数
// 程序退出后,执行该函数,重新启动进程
int CProcessExitHandler::handle_exit(ACE_Process* process)
map&string, pid_t&::iterator itrP
ACE_DEBUG((LM_INFO,
ACE_TEXT(&[%N:%l]: Process %d exited with exit code %d\n&),
process-&getpid (), process-&return_value()));
// 循环进程ID管理列表,根据进程ID找到退出的进程,重新启动进程
for(itrProcess = g_mapProcessInfo.begin(); itrProcess != g_mapProcessInfo.end(); ++itrProcess)
// 根据进程ID,查找进程名
if(itrProcess-&second == process-&getpid())
// 重新启动进程
ACE_Process_O
mand_line(itrProcess-&first.c_str());
pid_t pid = g_pPM-&spawn(options);
// 重新启动进程失败
if (pid == ACE_INVALID_PID)
ACE_DEBUG((LM_ERROR,
ACE_TEXT(&[%N:%l]: restart a child process error(%d)%s\n&),
pid, itrProcess-&first.c_str()));
return -1;
ACE_DEBUG((LM_INFO,
ACE_TEXT(&[%N:%l]: restart a child process success(%d)%s\n&),
pid, itrProcess-&first.c_str()));
// 注册回调(进程退出时,调用该回调)
g_pPM-&register_handler(this, pid);
// 添加启动成功的进程到进程ID管理列表
itrProcess-&second =
看过本文的人也看了:
我要留言技术领域:
你已经自动关注本知识库了哦!
确定要取消收藏吗?求助:为什么Android应用异常后会自动重启?
[问题点数:80分]
求助:为什么Android应用异常后会自动重启?
[问题点数:80分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年10月 总版技术专家分月排行榜第三
2014年3月 Java大版内专家分月排行榜第一2014年1月 Java大版内专家分月排行榜第一2013年12月 Java大版内专家分月排行榜第一2013年11月 Java大版内专家分月排行榜第一2013年10月 Java大版内专家分月排行榜第一
2014年1月 移动开发大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&&&&程序崩溃自动重启以及将未捕获到的异常写
&程序崩溃自动重启以及将未捕获到的异常写
1. 程序崩溃后,让它能自动重启,继续运行。
2. 对崩溃的程序,在退出前,自动在控制台上输出其退出堆栈详情,以便调试。(适合自动测试程序)
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
程序崩溃自动重启以及将未捕获到的异常写
所需积分:1
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
程序崩溃自动重启以及将未捕获到的异常写
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员算法+数据结构(17)
linux(150)
&1783人阅读&&&
如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题。&
下面的shell通过一个while-do循环,用ps -ef|grep 检查loader进程是否正在运行,如果没有运行,则启动,这样就保证了崩溃挂掉的进程重新被及时启动。
必须注意两点:
1、ps |grep 一个进程时必须加上其路劲,否则容易grep到错误的结果;
2、必须用 -v 从结果中去除grep命令自身,否则结果非空。
echo &Current DIR is & $PWD
while [ 1 ]
&propserverpid=`ps -ef|grep propserver|grep 6668|grep -v grep|awk '{print $2}'`
&if [ &$propserverpid& ]
&&echo &propserver is running,pid is & $propserverpid
&&kill -9 $propserverpid&
&&echo &propserver is down ,now starting ...&
&&nohup $PWD/propserver -c config.ini -p 6668 &
&如果启动此shell时发现进程已经存在,说明以别的方式启动了进程而不是此shell,那么它会持续提醒找到进程,解决办法是,要么只用此shell启动服务,要么一经发现以其他方式启动的服务即kill掉,上面的语句就是这么干的:
&&&&kill&-9&$pidof&$PWD/loader
另外运行脚本是老是提示这个错误:
: bad interpreter: 没有那个文件或目录
查了下解释如下
这种情况常见于通过windows平台传递shell脚本,导致bash编码出错,但这次是两台linux服务器通过ftp来传递的,应该不会出现这种问题,算了不管~问题出现了就先解决!
解决方法:
废话少说,直奔主题!
1.在新服务器中新建shell脚本文件。
# vi jobak
2.将原来服务器上的shell脚本的内容复制到刚刚创建的脚本文件,保存退出。
3.修改shell脚本的执行权限属性等等,这个自由发挥。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
exec+fork方式
笔者最终采用的exec+fork方式来实现的,具体思想如下:
1,exec函数把当前进程替换为一个新的进程,新进程由path或file参数指定。可以使用exec函数将程序的执行从一个程序切换到另一个程序;
2,fork函数是创建一个新的进程,在进程表中创建一个新的表项,而创建者(即父进程)按原来的流程继续执行,子进程执行自己的控制流程;
3,wait 当fork启动一个子进程时,子进程就有了它自己的生命周期并将独立运行,我们可以在父进程中调用wait函数让父进程等待子进程的结束;
相信介绍到这里,读者已经能够想到解决方法了:1)首先使用fork系统调用,创建子进程,2)在子进程中使用exec函数,执行需要自动重启的程序,3) 在父进程中执行wait等待子进程的结束,然后重新创建一个新的子进程。
使用方法:
点击隐藏BASH CODE
#./portmap 需要监控的程序的路径
#args portmap 需要的参数
$ ./supervisor ./portmap
代码如下:
#include &stdio.h&
#include &unistd.h&
#include &errno.h&
#include &string.h&
#include &sys/types.h&
#include &sys/wait.h&
#include &stdlib.h&
main(int&argc,&char&**argv)
&&&&int&ret,&i,&status;
&&&&char&*child_argv[100]&=&{0};
&&& pid_t pid;
&&&&if&(argc&&&2)&{
&&&&&&& fprintf(stderr,&&Usage:%s &exe_path& &args...&/n&,&argv[0]);
&&&&&&&&return&-1;
&&&&for&(i&=&1;&i&&&argc;&++i)&{
&&&&&&& child_argv[i-1]&=&(char&*)malloc(strlen(argv[i])+1);
&&&&&&& strncpy(child_argv[i-1],&argv[i],&strlen(argv[i]));
&&&&&&& child_argv[i-1][strlen(argv[i])]&=&'/0';
&&&&while(1){
&&&&&&& pid&=&fork();&
&&&&&&&&if&(pid&==&-1)&{
&&&&&&&&&&& fprintf(stderr,&&fork() error.errno:%d error:%s/n&,&errno,&strerror(errno));
&&&&&&&&&&&&break;
&&&&&&&&if&(pid&==&0)&{
&&&&&&&&&&& ret&=&execv(child_argv[0],&(char&**)child_argv);
&&&&&&&&&&&&//ret = execl(child_argv[0], &portmap&, NULL, 0);
&&&&&&&&&&&&if&(ret&&&0)&{
&&&&&&&&&&&&&&& fprintf(stderr,&&execv ret:%d errno:%d error:%s/n&,&ret,&errno,&strerror(errno));
&&&&&&&&&&&&&&&&continue;
&&&&&&&&&&&&}
&&&&&&&&&&& exit(0);
&&&&&&&&if&(pid&&&0)&{
&&&&&&&&&&& pid&=&wait(&status);
&&&&&&&&&&& fprintf(stdout,&&wait return&);
&&&&return&0;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:247649次
积分:3378
积分:3378
排名:第7408名
原创:28篇
转载:437篇
(12)(18)(21)(24)(4)(30)(27)(17)(4)(31)(151)(76)(8)(44)

我要回帖

更多关于 程序崩溃自动截取dump 的文章

 

随机推荐