我正在将重启功能编码到我最新的Crysis Wars服务器修改中,远程重新启动服务器。如果服务器出现问题并且简单的系统重新加载无法修复它,这很有用,告诉服务器在指定时间重新启动以释放内存也很有用。
为了实现这一点,我编写了所需的函数,应用程序本身没有问题重新启动。问题是端口没有足够快地关闭,导致应用程序的新实例无法正常运行。
我正在寻找一个理想的解决方案,程序关闭并在两个秒后启动,而不是立即启动。这样做可以让Windows有足够的时间来释放服务器正在使用的端口,并清理任何现有的内存。
请注意:我已经删除了我的其他(相关)问题,因为显然关闭程序端口是不可能的,如果它没有告诉它这样做它分配端口,这是我不能做的,因为我没有访问绑定到端口的代码的源代码。
代码,如果需要
int CScriptBind_GameRules::Restart(IFunctionHandler *pH)
{
bool arg1 = false;
const char *arg2 = "";
gEnv->pScriptSystem->BeginCall("Dynamic","GetValue");
gEnv->pScriptSystem->PushFuncParam("r.enable");
gEnv->pScriptSystem->EndCall(arg1);
gEnv->pScriptSystem->BeginCall("Dynamic","GetValue");
gEnv->pScriptSystem->PushFuncParam("r.line");
gEnv->pScriptSystem->EndCall(arg2);
if (arg1)
{
LogMsg(2, "System restart initiated.");
if (arg2)
{
LogMsg(2, "System Reboot.");
gEnv->pScriptSystem->BeginCall("os","execute");
gEnv->pScriptSystem->PushFuncParam(arg2);
gEnv->pScriptSystem->EndCall(), close((int)gEnv->pConsole->GetCVar("sv_port")->GetString());
return pH->EndFunction();
}
else
{
LogMsg(2, "Internal Faliure.");
return pH->EndFunction();
}
return pH->EndFunction();
}
LogMsg(2, "System restart cancelled: Feature is Disabled.");
return pH->EndFunction();
}
答案 0 :(得分:0)
我通常做的是添加一个命令行参数'StartupDelay'。当服务器/任何启动时,在尝试运行侦听器等之前,它会检查该参数。如果没有param,它会正常运行,如果它找到'StartupDelay = 2000',它会在尝试启动监听器等之前休眠2秒。
结果 - 如果从桌面图标启动,则会立即启动。如果它需要'重启自己',它会设置参数以指示自身的新实例按指示等待。