2009-06-18 8 views
2

J'ai une application java où je veux vérifier si une application est en cours d'exécution. Si ce n'est pas le cas, je veux le démarrer. S'il est en cours d'exécution, je veux le tuer et le redémarrer.Détection/contrôle d'un processus

Quelqu'un peut-il me dire comment faire? Je peux démarrer/arrêter le programme assez facilement avec ProcessBuilder. Mais je ne peux pas détecter un processus qui est déjà en cours d'exécution.

Merci pour votre aide! John

+0

Quelle plateforme/OS? Le programme "cible" est-il sous votre contrôle de développement, pouvez-vous le modifier? – basszero

Répondre

0

Cela peut sembler stupide, mais vous pouvez créer un fichier avec un nom connu au démarrage de l'application. N'a pas besoin de contenir quoi que ce soit. Pour vérifier si votre application est en cours d'exécution, vérifiez si ce fichier existe.

+0

Pas une bonne idée - lorsque l'application ou le système se bloque, le fichier traîne indéfiniment sans que l'application soit en cours d'exécution. –

+0

Vous avez absolument raison à ce sujet. – raupach

+0

C'est pourquoi vous écrivez le pid du processus dans ce fichier, ce qui vous permet de vérifier si le processus est en cours d'exécution lors de la lecture de ce fichier. S'il n'y a pas de processus avec ce pid, nettoyez le fichier. Si c'est le cas, mais qu'il a un nom différent ou quelque chose, nettoyez ce fichier. Sinon, refusez de courir. Ce n'est pas infaillible, mais c'est une solution très commune à ce problème. – wds

1

Sans la coopération de l'application (idéalement avoir l'écoute sur un port réseau), cela peut être impossible (votre application Java pourrait ne pas avoir le droit de tuer l'application) et nécessite un code spécifique au système d'exploitation. Sous Linux, vous devez utiliser les commandes ps et kill.

+0

N'existe-t-il pas d'autre mécanisme IPC pour Java? –

+0

Non. Pas dans l'API standard. –

0

L'autre application (le processus que vous surveillez) est-elle sous votre responsabilité? Si c'est le cas, vous pouvez utiliser une méthode que j'ai utilisée dans un système à haute disponibilité il y a quelques années: Ouvrez une connexion à cette autre application et envoyez-la «ping». Si l'autre application ne répond pas dans un délai donné, elle est soit arrêtée, soit "bloquée", ce qui est tout aussi mauvais (et que vous ne pouvez pas détecter par la surveillance du processus.) L'ouverture d'une connexion peut se faire à l'aide de sockets, ou plus protocoles sophistiqués (SOAP?). Une alternative est d'avoir l'application envoie un message "Je suis vivant" de temps en temps Si vous ne l'avez pas reçu dans un certain temps - votre application a besoin de redémarrer Pour réellement " kill "l'autre processus, vous pouvez garder l'instance de processus que vous obtenez à partir de la méthode exec(), et détruire() quand vous le souhaitez."

0

Merci pour les réponses, c'est ce que j'avais peur. J'essaie de ne pas ajouter plus de choses à l'application que je veux démarrer. une collection d'applications.

L'application de serveur Web que j'écris serait essentiellement démarrer/arrêter 3 applications qui se parlent tous pour atteindre un objectif. Si mon serveur web démarre et les arrête, tout va bien. Mais si, pour une raison ou une autre, ils courent déjà quand j'essaye de les démarrer, de mauvaises choses arrivent.

C'est quelque chose que je sais que je pourrais gérer avec Visual Studio (C++/C#/etc). Mais ce projet doit être écrit en Java en raison d'une exigence d'indépendance de la plate-forme.

Merci pour votre aide à tous!