Voila, un serveur prend de plus en plus de taille en memoire lorsqu'il tourne longtemps. Il faut alors le rebooter une fois de temps en temps afin d'avoir un module sans trop de lag "tout beau tout neuf".
Voici donc un script que j'utilise pour relancer le module tout les jours sans avoir besoin de toucher au serveur. Ce script n'est utile en fait que pour les mondes persistants qui voient tourner tout le temps leur serveur.
Le script previent tout le monde une minute avant le reboot serveur. Il sauvegarde tout les persos avant de les kicker et ensuite rebooter. Le delai par defaut est 86000 secondes (24heures) et est tout a fait configurable. Enfin, le script se place dans un OnclientLeave du module (ca serait vraiment méchant de le faire OnClientJoin). Par ailleurs, j'utilise la base de donnée afin de tester le temps ecoulé entre les reboots; il n'y a donc pas de gros DelayCommand qui tourne en Background.
Parametre de la table a créer :
nom : LastSlept
player (texte)
tag (texte)
name (texte)
val (texte)
expire (texte)
last (Date/Heure)
Ce sont les types par defaut de MS Access 2000
///////////////////////////////////////////////////////////
// Script de reboot serveur, Par Rhyghar
// D'apres le script de de repos de Lucindrea
///////////////////////////////////////////////////////////
#include "aps_include"
void broadcast(string texte)
{
object oPC = GetFirstPC();
while(oPC != OBJECT_INVALID){
SendMessageToPC(oPC, texte);
oPC = GetNextPC();
}
}
void Kick()
{
object oPC = GetFirstPC();
while(oPC != OBJECT_INVALID){
BootPC(oPC);
oPC = GetNextPC();
}
}
void rebootsequence()
{
broadcast("Reboot Serveur dans une minute !!!");
broadcast("Sauvegarde des Personnages...");
ExportAllCharacters();
DelayCommand(5.0f, broadcast("Personnages sauvegardes..."));
DelayCommand(30.0f, broadcast("Reboot serveur dans 30 secondes..."));
DelayCommand(50.0f, broadcast("Reboot serveur dans 10 secondes..."));
DelayCommand(55.0f, broadcast("Reboot serveur dans 05 secondes..."));
DelayCommand(60.0f, broadcast("Ejection des joueur..."));
DelayCommand(62.0f, Kick());
DelayCommand(65.0f, broadcast("Reboot serveur..."));
DelayCommand(70.0f, StartNewModule(GetModuleName()));
}
void main()
{
object oMod=GetModule();
string sModTag = GetTag(oMod);
int A = TRUE;
//First get the time last rested in yyyymmddhhmmss format
string sSQL = "SELECT val FROM LastSlept WHERE tag='"+sModTag+"';";
SQLExecDirect(sSQL);
SQLFirstRow();
string sTimeSlept = SQLGetData(1);
//SendMessageToAllDMs("last slept as string" + sTimeSlept);
if (sTimeSlept == "")
{
A = TRUE;
SQLExecDirect("SELECT NOW() + 0");
SQLFirstRow();
string sTimeNow = SQLGetData(1);
SetPersistentString(oMod,sModTag,sTimeNow,0,"LastSlept");
}
sSQL = "SELECT DateDiff('s', #"+sTimeSlept+"#, Now());";
SQLExecDirect(sSQL);
SQLFirstRow();
string difference = SQLGetData(1);
int iDiff = StringToInt(difference);
// 24 heures = 24*3600 secondes = 86400 secondes
if(abs(iDiff) > 86400)A = FALSE;
if (A)
{
return;
}else{
SQLExecDirect("SELECT NOW() + 0");
SQLFirstRow();
string sTimeNow = SQLGetData(1);
// dump current time into database called LastSlept
SetPersistentString(oMod,sModTag,sTimeNow,0,"LastSlept");
WriteTimestampedLogEntry("reboot automatique serveur : "+ sTimeNow);
rebootsequence();
}
}