Une seule instance de programme sans socket

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 351 fois - Téléchargée 19 fois

Contenu du snippet

Dans le cadre d'un projet, je devais mettre en place un système multi-agents sur un réseau très sécurisé. Le problème que je rencontrais est que les utilisateurs avaient tendance à lancer plusieurs fois mon programme, ce qui n'est pas terrible. La plupart des solutions proposés pour éviter cela sont soit pas très élégante, soit ont des failles.

Par socket : nous crééons un serveur sur un port particulier. Problèmes : pas très élégant, et sur un réseau sécurisé, n'est pas adéquate
Par verrouillage de fichier : nous faisons un lock sur un fichier en local du programme. Problèmes : lorsque nous n'avons pas les droits d'écritures, ou lorsque le programme est interrompu violemment

Une troisiéme solution consiste de créer en natif un programme palliant cette solution, sauf que je recherchais une solution multiplateforme, et qui ne me demande pas trop de formation (je suis null en C/C++ .. faudrait que je m'y penche un jour ...)

Et j'ai eu une petite idée : accéder au répertoire temporaire du système (où normalement, nous avons toujours le droit d'accès et d'écriture), créer u fichier qui se détruit à la fin du programme. Ainsi, si le fichier n'est pas créé, alors nous pouvons lancer le programme. Sinon, nous devons le stopper. Par contre, si nous l'arrêtons brutalement, il rsique ne plus amrcher :/

Je vous propose donc ma solution. Elle ne résoud pas tous les problèmes lié à ce sujet mais aide quand même pour un très grand nombre de cas :)

Source / Exemple :


package perso.device.system;

//Import needed packages
import java.io.File;
import java.io.IOException;
import java.security.AccessController;

import sun.security.action.GetPropertyAction;

/**

  • <p>Title : UtilitiesSystem</p>
  • <p>Description : lass device for System</p>
  • <p>Copyright : Copyright (c) 2007</p>
  • <p>Society : Perso</p>
  • @author Indiana_jules
  • @version 1.0
  • /
public class UtilitiesSystem { /**Method detecting if an instance of a program is running
  • @param name Program's name
  • @return Return the state
  • @throws IOException Input/Output error
  • /
public static synchronized Boolean isSingletonProgram(String name) throws IOException { Boolean statut = true; GetPropertyAction a = new GetPropertyAction("java.io.tmpdir"); String tmpdir = ((String) AccessController.doPrivileged(a)); File temporaryFile = new File(tmpdir + "/" + name +".tmp"); statut = !temporaryFile.exists(); if(statut){ temporaryFile.createNewFile(); temporaryFile.deleteOnExit(); } return statut; } }

A voir également

Ajouter un commentaire

Commentaires

Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Salut,

pourquoi hasardeux ?
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
12
jl'avais oublié celui la mais bon je trouve ca un peu hasardeux
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Salut,

idem le seul kill que tu ne peux trapper c'est le kill -9 deunix le reste tu peux...
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
12
lol je parlais d'un reboot sauvage comme le font parfois certains pc ...
ou alors si tu kill le processus ...
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Salut,

ouep et tu peux aussi supprimer le fichier dans un shutdownhook que tu ajoute à l'objet Runtime grâce à la méthode addShutdownHook de ce dernier (histoire d'être plus propre....
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.