IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB2005] Démarrer un service depuis un autre


Sujet :

VB.NET

  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut [VB2005] Démarrer un service depuis un autre
    Bonjour à tous,

    Tout est dans le titre. Je cherche à pouvoir démarrer un service (S2) depuis un autre service (S1).

    Alors j'ai bien sûr déjà cherché des infos sur le sujet.

    Jusqu'à présent, j'ai essayé en utilisant un composant ServiceController.
    J'ai spécifié le nom de S2 et la machine sur lequel il se trouve.

    Jusque là, rien n'y fait, j'obtiens systématiquement le message d'erreur suivant (dans le journal des évènements) :

    Cannot open S2 service on computer 'lamachineenquestion'.
    Y a-t-il des paramètres supplémentaires à donner ? Mes recherches sur le net me conduisent toutes à ce genre de résultats...

    Merci d'avance.

    Griftou.

  2. #2
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Je patauge vraiment dans la semoule...

    Je me dis que p-e j'ai donné un mauvais nom de service (un espace devant ou derrière, une faute de frappe, etc.) donc finalement j'ai fait comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For Each sc as ServiceProcess.ServiceController in ServiceProcess.ServiceControle.GetServices("leserveurquivabien")
         If sc.ServiceName = "VTE" Then
              sc.Start()
         End If
    Next
    Là comme ça, s'il le trouve pas bin il devrait rien se passer et s'il le trouve, il devrait le démarrer.

    Et bien non... Il le trouve bien vu mais ça plante sur le sc.Start().
    L'erreur est récupéré par un try catch qui m'écrit dans le journal des évènements le joli message suivant :
    Cannot open VTE service on computer 'leserveurquivabien'.
    Bref... Pourquoi est-ce que le service qui effectue l'instruction sc.Start() n'a-t-il pas le "droit" de le faire ?

    Help please

    Griftou.

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    et un shell "net start nom_du_service" ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Sorry mais... "shell" ?

    Tu veux dire faires un process.start("net start VTE") ?

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    shell ou process.start ca revient au meme
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    OK, je ne connaissais pas la syntaxe avec shell.

    Sinon, je crois que je viens de découvrir le problème.

    Le sc.start fonctionne en fait. C'est le service qui doit être lancé qui foire

    Dans ce service, j'appelais une sub dans la méthode onStart mais apparemment, il n'aime pas ça...

    Je n'avais pas encore tester en lançant le service manuellement car le code vient d'un programme console qui tourne nickel et j'ai juste tout copier coller et fait un appelle de procédure. Donc pour moi, c'était "no brain".

    Donc je teste en mettant un timer sur qqch genre 5 sec...

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    un service ne fonctionne pas comme une appli normale
    le onstart a un délai maxi, si passé ce délai tu n'es pas sorti du onstart le démarrage du service est considéré en échec

    les windows.forms.timer ne fonctionnent apparement pas dans un service (il reste 2 autres types de timer dans le framework qui doivent aller)

    sinon en général dans un service on démarre un thread qui boucle (avec un .sleep quand meme) dans le onstart
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ok, je comprends mieux maintenant le problème.

    J'ignorais le truc du timeout pour le onstart.

    Par contre j'ai un autre service et celui là, parfois il se lance, parfois il refuse.

    Je ne change bien sûr rien dans le onstart d'une fois à l'autre.

    Est-ce possible qu'une même série d'instructions s'exécutent en des temps différents d'une fois à l'autre ?

    Je veux dire... Je sais bien que ce n'est jamais exactement le même temps qui est pris pour les exécuter mais à moins d'être vraiment à la limite du timeout, pour que ça plante une fois et pas l'autre, il doit y avoir une fameuse différence non ?

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    en théorie c'est le meme temps
    mais en pratique non

    en faisant le parallèle avec un copie de fichier sur l'explorateur windows
    si tu copies un fichier et que la copie prend 2 minutes
    maintenant tu copies le même fichier mais en même tu en copies 3 autres, le 1er ne mettra pas 2 minutes mais peut etre 10 ...

    donc c'est pareil si le processeur et autre ressources sont plus sollicités le temps d'exécution est plus long
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ah oui, très juste pour l'exemple.

    Bon bin dans cas, voici ma procédure OnStart :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Protected Overrides Sub OnStart(ByVal args() as String)
        ' Add code here to start your service.  This method should set things
        ' in motion so your service can do its work.
        Jevent.WriteEntry("Démarrage du service")
        Timer1.Enabled = True
        Dim sr as New StreamReader(localDir & "ftpserver.txt")
        siege = sr.Readline.split(";")
        ftpServer = sr.Readline.split(";")
        sr.Close()
        sr.Dispose()
    End Sub
    Tu trouves que j'y fais trop de choses ??
    J'y ai mis les instructions qui doivent être initialisées au début du processus.
    Elles ne changent plus par après.
    Note que je pourrais le faire au début de l'event du timer....

    Ca m'éviterait d'avoir à restarter le service si le contenu des fichiers est amené à être modifié (changement de serveur ftp par exemple).

    Quelle est la meilleure marche à suivre ? Pour seule formation sur les services, j'ai suivi un tuto présent sur ce site qui explique comment faire un service qui check la mémoire utilisée.

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    lie une seule ligne dans un fichier c'est pas long en théorie, donc tu pourrais le laisser dans le onstart
    par contre des try catch c'est recommandé, avec enregistrement de l'erreur dans un fichier ou dans le journal, car quand on service plante on ne peut pas savoir pourquoi sinon
    et tout le monde peut potentiellement faire des bugs

    si tu veux déporter ca dans un thread ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Protected Overrides Sub OnStart(ByVal args() as String)
        ' Add code here to start your service.  This method should set things
        ' in motion so your service can do its work.
        Jevent.WriteEntry("Démarrage du service")
       dim th as new system.threading.thread(addressof StartAsync)
       th.start
    End Sub
     
    Private Sub StartAsync()
      try
        Timer1.Enabled = True
        Dim sr as New StreamReader(localDir & "ftpserver.txt")
        siege = sr.Readline.split(";")
        ftpServer = sr.Readline.split(";")
        sr.Close()
        sr.Dispose()
      catch ex as exception
        ' enregistrement de l'erreur
      end try
    End Sub
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ouais, le try catch est une habitude que je n'ai pas encore...

    Je vais tester ta méthode avec le thread pour voir.

    Une question concernant le thread pcq j'ai pas non plus l'habitude de jouer avec ça....

    Une fois qu'il aura fini son process, il se "détruit" lui-même ou bien je dois faire un dispose quelque part ?

    C'est un truc qui m'a pas mal perturbé ça... Je me souviens avoir appris (je ne sais plus si c'est à l'école ou dans un bouquin) que chaque fois que j'écrivais un "new", je devais écrire un "dispose". Or en .net, y a pas toujours de dispose pour les objets dont on fait un new...

    Bon, je teste le thread et je donne un feedback

    Griftou.

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    à la fin du thread celui ci se "détruit" oui
    et pour comprendre ce qu'est un thread, il suffit de voir en debug ce que ca donne
    quand on fait du pas à pas, on a une ligne jaune qui avant à chaque fois qu'on fait F10 ou F11
    en démarrant un thread, ca créé une nouvelle ligne jaune en gros qui avance en meme temps que l'autre

    et un new ne veut pas forcément dire un dispose
    plus d'explications sur ce topic :
    http://www.developpez.net/forums/d83...sqldatareader/
    il doit manquer le concept du finalize, qui fait que meme quand on oublie d'appeler dispose le GC le fera (peut etre beaucoup plus tard par contre)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ca m'a l'air de tourner nickel maintenant.

    Merci bcp !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Appeler un service depuis un autre
    Par david42 dans le forum Symfony
    Réponses: 4
    Dernier message: 08/04/2012, 10h33
  2. démarrer un service depuis autre pc
    Par luta dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 26/09/2007, 14h07
  3. Réponses: 18
    Dernier message: 10/09/2007, 15h51
  4. Démarrer un service Windows depuis Linux
    Par xionis dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 17/04/2007, 13h09
  5. Réponses: 30
    Dernier message: 02/12/2005, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo