[NWNX] Reboot automatique du serveur pour monde persistants

Répondre
Partager Rechercher
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


Code PHP:

///////////////////////////////////////////////////////////
// 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(oPCtexte);
        
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.0fbroadcast("Personnages sauvegardes..."));
     
DelayCommand(30.0fbroadcast("Reboot serveur dans 30 secondes..."));
     
DelayCommand(50.0fbroadcast("Reboot serveur dans 10 secondes..."));
     
DelayCommand(55.0fbroadcast("Reboot serveur dans 05 secondes..."));
     
DelayCommand(60.0fbroadcast("Ejection des joueur..."));
     
DelayCommand(62.0fKick());
     
DelayCommand(65.0fbroadcast("Reboot serveur..."));
     
DelayCommand(70.0fStartNewModule(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 == "")
{
    
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)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();

}

__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
c'est sympa, mais j'ai des questions concernant ceci. Ce n'est que pour ceux qui ont NWNX ou bien on peut le transformer pour l'utiliser avec la bdd de bioware.

Et l'include "aps_include" euh c quoi ?
l'aps include est l'include de nwnx : télécharge le et tu l'auras...

Sinon, le ExportAllChars() enregistre les persos pour des local Vault et si on est en servervault, il faut des fonctions home made ou pas ?

En tous cas merci de me répondre.

Pour ceux qui trouve que scripter c'est chiant et que celui-ci on pourrait bien l'incorporer à un programme, et bien réjouissez vous car FastFrench a dans son NWNX_MySQL 3.20 intégrer un autoreboot paramétrable suivant le lag détecté... Sympa non...
RDV sur le Vault pour le télécharger : vive la French Touch !

Prince Nexus.
en servervault, ExportAllChar enregistre tout dans le repertoire servervault (pour info un ExportAllChar ne semble pas generer autant de lag en servervault qu'en local vault. Je l'utlise aussi a chaque fois que quelqu'un se repose pour sauvegarder les personnages dans le cas fort peu probable d'un possible, éventuel, et hypotéthique crash serveur).
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Damonya :
Euh, oui ca n'est que pour NWNX, les commandes SQL tels que Now() qui renvoie l'heure courante ou bien un Datediff (je me suis bien galéré a le trouver celui là) qui renvoie la difference de temps en minutes ou seconde ou année etc... entre deux dates n'est accessbile que par du SQL et donc pas par la BDD de Biowarez (hum...).
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Alors la fonction ExportAllCharacters() a ete corrigee ? Quand j'avais voulu l'utiliser, en 1.29, elle ne marchait pas en servervault et j'ai du abandonner le script que je voulais faire. Marcherait-elle en 1.32 ? Ca fait un moment que je ne suis pas a jour avec NWN.
Je ne pense pas que ExportAllChars soit cassé. Je n'etais pas au courant en tout cas...

Par contre je sais que cette fonction ne marche qu'en Multiplayer et ne sert a rien en singleplayer. A la place, tu peux utiliser ExportSingleCharacter().
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Simple test a faire. Tu fais un perso et tu lui donne de l'xp puis tu le sauvegarde avec ExportAllCharacters. Ensuite, tu crash le serveur (tu le ferme pas, tu le fais planter) puis tu reviens avec ton perso. Si le perso a toujours son xp (sans s'etre deco normalement) alors la fonction ExportAllCharacters marche correctement sinon, ya un gros bug.
En 1.29, ca ne marchait pas. Comme mon script servait a la sauvegarde des pj du serveur et qu'il ne devait plus y avoir e sauvegarde en dehors de ca, c'etait assez ennuyeux.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés