Savoir si un démon est lancé

19:53 modifié dans API AppKit #1
Bonjour. Tout d'abord j'espère poster dans le bon forum, toutes mes excuses dans le cas contraire :p

Voici mon chtit problème à  vous soumettre : en premier projet cocoa, j'ai une application nommée "HostPinger Admin" et un démon qui lui est associé, nommé "HostPinger"

à  l'ouverture de HostPinger Admin, j'aimerais savoir si le démon est actuellement lancé ou pas. J'avais donc d'abord pensé utiliser [[NSWorkspace sharedWorkspace] launchedApplications]
Mais cette méthode ne liste que les applications avec GUI... Donc j'avais pensé en second recours utiliser un NSTask. Pour me simplifier la vie j'ai donc fais un NSTask qui éxécute /bin/bash, et je lui mets en NSPipe input "ps -ux | grep -w HostPinger"
malheureusement le NSPipe du output me retourne une chaà®ne vide... Ce que je ne comprends pas c'est que si je mets "ps -uxc | grep -w HostPinger" en input, la chaà®ne retournée n'est pas vide... Quand j'éxécute ps -ux | grep -w HostPinger dans le terminal, il me retourne bien quelque chose... ???

je sais pas si je suis très clair, en tout cas voici mon code (pas très clean :p :p) :

NSTask *theTask = [[NSTask alloc] init];<br />	NSPipe *thePipe = [NSPipe pipe];<br />	<br />	NSPipe *inputPipe;<br />	NSString *leTrucAExecuter =@&quot;ps ux | grep -w HostPinger &amp;&amp; exit&#092;n&#092;n&quot;;<br />	inputPipe = [[NSPipe pipe] retain]; <br />	NSFileHandle *writeHandle;<br />	writeHandle = [inputPipe fileHandleForWriting];<br />	[theTask setStandardInput:inputPipe];<br />	<br />	NSFileHandle *pipeOutput = [thePipe fileHandleForReading];<br />	NSString *theString = nil;<br />	<br />	[theTask setLaunchPath:@&quot;/bin/bash&quot;];<br />	NSData *myData = [leTrucAExecuter dataUsingEncoding:NSMacOSRomanStringEncoding allowLossyConversion:YES];<br />	[writeHandle writeData: myData];<br />	<br />	[theTask setStandardOutput:thePipe];<br />	<br />	[theTask launch];<br />	[writeHandle closeFile];<br />	while ([theTask isRunning]) { }<br />	NSLog(@&quot;%@&quot;,[pipeOutput availableData]);<br />	theString = [[NSString alloc] initWithData:[pipeOutput availableData] encoding:NSASCIIStringEncoding];<br />	<br />	[theTask release];<br />	NSLog(@&quot;string output :  %@&quot;,theString);

et la string retournée est vide...

sinon pour le "while ([theTask isRunning]) { }" je sais bien qu'il existe waitUntilExit, mais je ne sais pas pourquoi de temps en temps il se met à  déconner à  et attendre indéfiniment B)

bref : :why?: :p

et merci d'avance :)

Réponses

  • 19:53 modifié #2
    Bienvenue sur le forum!

    Encore une autre solution, mais valable que si ton daemon est écrit en Objective C: passer par les objets distribués. En gros, tu crées une NSConnection de type "serveur" sur le daemon, l'appli agit comme un client et cherche à  se connecter sur le serveur.

    Pour la classe  "serveur" et la classe "client", il te faut une variable d'instance de type NSConnection (conn ici).

    Du côté daemon
    <br />&nbsp; &nbsp; &nbsp; &nbsp; conn = [[NSConnection alloc] init];<br />&nbsp; &nbsp; &nbsp; &nbsp; [conn setDelegate:self];<br />&nbsp; &nbsp; &nbsp; &nbsp; [conn setRootObject:self];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; if (![conn registerName:@&quot;test?]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;Impossible de créer le server&quot;); // se produit par exemple si une connexion est déjà  ouverte sous ce nom<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />
    


    Du côté client
    <br />&nbsp; &nbsp;  conn = [[NSConnection connectionWithRegisteredName:@&quot;test&quot; host:nil] retain];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; if (!conn) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  NSLog(@&quot;Impossible de se connecter au serveur&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; [conn setDelegate:self];<br />
    


    Alors cette méthode a d'autres avantages. Une notification (NSConnectionDidDieNotification) est envoyée si la connexion se rompt (autrement dit quand le daemon plante). Et en faisant [conn rootObject]; tu accèdes à  l'instance qui a créé la connexion (car on a fait un setRootObject:self du côté serveur), et tu peux y accéder (presque) comme si c'était une instance "locale", alors qu'elle se trouve dans une autre application...

    Voili voilou
  • 19:53 modifié #3
    Merci beaucoup :) Mon démon est effectivement réalisé en objective-C donc ca ne devrait pas poser de problème :)

    J'avoue que je connaissais de nom les NSConnection, mais on m'en avait toujours parlé comme d'une classe extrêmement compliquée.... Je vais donc essayer ca tout à  l'heure :)

    Encore merci !!
Connectez-vous ou Inscrivez-vous pour répondre.