2010-05-05 5 views
2

je déploie un petit service à un système UNIX (AIX). Je veux vérifier s'il n'y a pas d'instance active de ce service en cours d'exécution lors du démarrage. Quelle est la fiabilité de l'implémentation de ce contrôle?Verrouillage d'un fichier pour vérifier une exécution unique d'un service. Quelle est la fiabilité?

  1. Essayez d'acquérir un verrou sur un fichier (w/FileChannel)
  2. Si réussit, garder verrouillage et continuer l'exécution
  3. En cas d'échec, de sortie et refuser d'exécuter le corps principal

Je connais un logiciel comme le wrapper Tanuki, mais je recherche une solution plus simple (peut-être pas portable).


EDIT: En ce qui concerne PIDFILE (s): Je veux éviter de les utiliser si possible, car je ne dispose pas de droits d'administrateur sur la machine, ni les connaissances dans la programmation shell AIX.

Répondre

2

Une alternative serait de se lier à un port spécifique sur le serveur en utilisant un ServerSocket, si le port est en cours d'utilisation, votre service est déjà en cours d'exécution:

int port = 12345; 

try { 
    java.net.ServerSocket ss = new java.net.ServerSocket(port); 
} catch (java.net.BindException ex) { 
    System.err.println("service is already running and bound to port "+port); 
    System.exit(1); 
} 

L'avantage de cette approche est qu'elle fonctionne bien sur à peu près n'importe quelle plate-forme.

+0

@ninesided tout autre service ou application sur ce système utilise également le même port et est en cours d'exécution lorsque l'OP tente d'exécuter son service? –

+0

Si vous avez d'autres services qui se lient aux ports en cours d'exécution sur votre serveur J'espère que vous savez ce qu'ils sont et éviter les numéros de port. Certains services se lient au port libre aléatoire, mais ils choisissent presque toujours ce numéro dans une plage définie. Je doute fort que vous n'ayez plus de ports dans la plupart des situations du monde réel. – ninesided

+1

J'ai fini de l'utiliser. Belle approche en effet! –

0

Pourquoi ne pas utiliser un pidfile? http://www.linux.com/archive/feed/46892

Vérifiez si un fichier existe. Si c'est le cas, avertissez l'utilisateur et quittez immédiatement. Sinon, créez ce fichier et continuez à l'exécuter.

3

Traditionnellement sur les systèmes Unix cela se fait en créant un /var/run/nameofservice.pid de fichier. Au démarrage, vous vérifiez si un tel fichier existe, sinon, créez-le et continuez. Ensuite, lorsque le service est arrêté, le fichier pid est supprimé.

Comme son nom l'indique, le contenu de ce fichier est le PID du service. Cela permet une forme de récupération d'erreur, quand le service démarre et détecte qu'un fichier PID existe, au lieu de simplement quitter, il peut vérifier si un processus avec ce PID existe réellement, et sinon, ce qui implique que le démon de service a planté, commencer et essayer de récupérer à partir du crash précédent.

+1

Eh bien c'est bien sûr de tout programme natif, mais pas java - pas d'accès au PID du processus en cours, aucun moyen de vérifier que certains PID est vivant et ainsi de suite et ainsi de suite ... –

Questions connexes