Gå til innhold

Jscript cscript memory leaks?


Anbefalte innlegg

Hei

 

Har en del watchfolderscript kjørende på en server. Kort fortalt søker de gjennom en gitt mappe og flytter filer ut ifra filnavn. De fungerer veldig fint, men serveren har problemer med at alt minne spises opp uten at det er tilknyttet noen prosess i taskmngr.

Det kjører også andre typer programmer og skript på denne serveren, men jeg har mistikanke om at det er slike som disse scriptene som skaper problemer. Hvordan kan jeg unngå minnelekasjer i disse?

 

 

var fso = WScript.CreateObject("Scripting.FileSystemObject");
var fsob = WScript.CreateObject("Scripting.FileSystemObject");

WScript.echo("Hocus Focus inhouse script for sorting encoded media files into project folders");
WScript.echo("\n");

zerolead = function(tall) {
if (tall < 10) {
	return "0" + tall;
} else {
	return tall;
}
}
while (1) {
 var filtype = "QT DV";
 var extensionver ="mov";
 var extensioncap ="MOV";
 var arkivert = "E:\\Arkivert";
 var fsosub = new Enumerator(fso.GetFolder(".").Files);
 var project;
 var projectdir;
 var projectdirexist;
 var strippedfilename;
 var datedfilename;
 var year;

 for (i=0;!fsosub.atEnd();fsosub.moveNext()) {
if (fso.GetExtensionName(fsosub.item().name)==extensionver || fso.GetExtensionName(fsosub.item().name)==extensioncap) {
  WScript.echo('Found QT file: '+fsosub.item().name);
  project = fso.GetBaseName(fsosub.item().name).substr(0, 4);
  if (project > 1000 && project < 9999) { 
	WScript.echo('File project: '+project);
	projectdirexist = 0;
	while (!projectdirexist) {
	  var fsoarkivert = new Enumerator(fsob.GetFolder(arkivert).SubFolders);
	  for (i=0;!fsoarkivert.atEnd();fsoarkivert.moveNext()) {
		projectdir = fsob.GetBaseName(fsoarkivert.item().name);
		if (projectdir.substr(0, 4)==project) { 
		projectdirexist = 1;
		WScript.echo("Project folder: "+arkivert+"\\"+projectdir);
		  if (!fso.FolderExists(arkivert+"\\"+projectdir+"\\"+filtype)) {
			WScript.echo("Creating "+filtype+" directory");
			fso.CreateFolder(arkivert+"\\"+projectdir+"\\"+filtype);
			WScript.echo(filtype+" directory created successfully");
		  } else {
			WScript.echo("Found existing "+filtype+" directory");
		  }
		  // Adding date and time to the filename
		  strippedfilename = fsob.GetFileName(fsosub.item().name).substr(4);
		  if (fsob.GetFileName(fsosub.item().name).substr(5,6) > 080000) {
			WScript.echo("File is already date stamped");
			datedfilename = project+strippedfilename; 
		  } else {
			WScript.echo("File is not date stamped");
			  d = new Date();
			  year = d.getYear()+"";
			  year = year.substr(2);
			  datedfilename = project+"_"+year+zerolead(''+(d.getMonth() + 1))+zerolead(''+d.getDate())+"-"+zerolead(''+d.getHours())+zerolead(''+d.getMinutes())+strippedfilename;
		  }

		  if (!fso.FileExists(arkivert+"\\"+projectdir+"\\"+filtype+"\\"+datedfilename)) {
			WScript.echo("Moving  "+fsosub.item().name+" to "+arkivert+"\\"+projectdir+"\\"+filtype+"\\");
			fso.MoveFile(fsosub.item().name, arkivert+"\\"+projectdir+"\\"+filtype+"\\"+datedfilename);
		  } else {
			WScript.echo("File already exists in destination. Skipping file.");
		  }
		}
	  }
	  if (!projectdirexist) {
		WScript.echo("No folder found for project "+project);
		WScript.echo("Creating project directory");
		fso.CreateFolder(arkivert+"\\"+project);
		WScript.echo("Project directory created successfully");
	  }
	}
  } else {
	WScript.echo('Could not determine file project');
  }
  WScript.echo("\n");
}
 }
 WScript.sleep(30000);
}

 

Endret av bosannes
Lenke til kommentar
Videoannonse
Annonse

Jeg har ingen erfaring med kjøring av skript så lenge, men jeg ville tro at skript behandleren hadde en gc/rc som fiksta memleaks.

Hvorfor tror du det er skriptene som lekker?

 

Uansett skal alt minne deallokeres når programmet avslutter så du kan prøve ved å en etter en å se hva som skjer.

 

PS: det er noe som heter resource leak som man ikke er helt sikra mot ved å avslutte programmet, men etter en kjapp kikke gjennom skriptet ser jeg ingen tegn til slike

 

Jeg er ute på tynn is her så ta ting jeg sier med en klype salt, men jeg håper det hjelper.

Lenke til kommentar
Takk. Er ikke helt sikker på hva som lekker, men det er det jeg prøver å finne ut.

Hva er det jeg bør se etter for "resource leaks"?

 

Resource leak er åpne filer socketer og andre ting som ikke nødvendigvis blir avslutter hvis programmet ikke gjøre det. Hvordan du kan lete etter åpne filer vet jeg ikke, men til socket kan du jo bruke netstat

Lenke til kommentar

Ofte har det vært vanlig å sett objekter spesifik lik null (Nothing i VBS) for å passe på at GC-en til Windows Scripting host skal ta hintet.

 

Som giddion sier, så kan WScript fortsatt holde ressurser låst (som filer, sockets og databasekoblinger) selv om scriptet ditt er avsluttet. Om dette vil skape noen alvorlige hull vet jeg ikke, fordi jeg stort sett ikke bruker scripts lenger.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...