Forum Linux.général Ne lancer qu'une seule instance d'un programme

Posté par  .
Étiquettes : aucune
0
26
juil.
2007
Salut à tous,

Je souhaiterais savoir s'il y a un moyen de faire en sorte qu'un programme ne puisse être lancé en double.
L'idée est par exemple que si j'ai un Cronjob qui execute toutes les 2 minutes un programme ou un script, il ne peut pas relancer ce programme après 2 minutes si le précédent ne s'est pas encore terminé (on pourrait imaginer une sorte de LOCK ).

Quelqu'un aurait il une idée :)?

Merci !
  • # /var/lock

    Posté par  . Évalué à 7.

    Créer un fichier quelque part, encapsuler le programme dans un script qui vérifie si le fichier existe avant d'éventuellement lancer le programme.
    C'est comme ça que font tous les inits (ou presque) dans ma distrib.
  • # pid

    Posté par  . Évalué à 5.

    encapsule ton programme dans un script :
    ce script doit récupérer le PID du programme une fois lancé (cf man bash pour + de détails) et stocke le dans un fichier style monprogramme.pid.
    L'emplacement standard de ce genre de fichiers est plutot dans /var/run

    en début de ce script script qui appelle ton programme vérifie :
    1 - la non existence du fichier
    2 - si le PID stocke dans ce fichier tourne

    -> tu peux ainsi décider de ne pas lancer ton programme après

    hope it helps
  • # Autre proposition : socket réseau

    Posté par  . Évalué à 2.

    Bonjour,

    Pour la création de fichier (le PIDFILE, un lock), je conseille l'utilisation d'un outil fort sympatique: lockfile (il est présent dans le paquet de procmail).

    Sinon, tu peux aussi utiliser une socket réseau (plus complexe quoique) car en écoutant sur un port particulier (>=1024 si non root), tu réserves une ressource unique (du moins, sous Unix/Linux) qui peut aussi servir à contrôler l'exécution (par exemple, après N tentatives, utiliser kill :P).

    Bon courage !

    Cdlt,

    PS: Ah oui, grep peut aussi servir mais c'est plus sioux ;-)
    • [^] # Re: Autre proposition : socket réseau

      Posté par  . Évalué à 3.

      Verboten de verrouiller les ports réseau pour créer des locks !

      D'abord, ce sont des ressources qui n'ont rien à voir et qui sont beaucoup plus limitées qu'un fichier dans /var/lock. Ensuite, c'est faire l'hypothèse que l'application tourne dans un environnement mono-utilisateur et tout le monde sait bien que ce n'est pas le cas d'UNIX.

      Au boulot, on utilise des serveurs centralisés accessibles avec des Thin Clients. Aussi bien sous Windows que sous Linux, d'ailleurs, malgré les sessions utilisateur multiples et distinctes, seul le premier venu peut lancer certaines applis propriétaires parce que le coder a travaillé comme un cochon, et comme l'application se contente généralement d'examiner le port indépendamment de l'adresse à laquelle il est associé, on se retrouve généralement avec une machine qui a un port ouvert sur le réseau en permanence, pour rien.

      La manière normale de le faire, c'est effectivement la création d'un fichier dans /var/lock avec l'identifiant unique de l'application et son PID, de façon à pouvoir la contacter pour voir si elle existe toujours. Dans le même esprit, un socket UNIX, et pas IP, pour lui causer directement.

      Et dans tout les cas, un ramasse-miette pour faire le ménage derrière.
  • # Merci

    Posté par  . Évalué à 1.

    Merci à vous! Je vais voir ca de plus près et je vous tiens au courant !
  • # Si le programme plante....

    Posté par  . Évalué à 1.

    Le fichier crée dans /var/lock ne sera alors pas effacé non?
    A ce moment la il faudrait supprimer à la main le fichier , ce qui n'est pas très élégant.
    • [^] # Résultat

      Posté par  . Évalué à 1.

      Voici pour le moment ce que j'ai fait, et ca marche plutot bien :)

      #!/bin/bash

      #on verifie si un fichier lock existe deja
      if [ -e /var/lock/file.lock ]
      then
      echo lancement_impossible

      #on cree le LOCK, lance le programme voulu, puis supprime le LOCK
      else
      touch /var/lock/file.lock
      /usr/sbin/backup-manager
      rm /var/lock/file.lock
      fi

      Par contre pas testé si ca plante ...
  • # Pourquoi faire simple quand on peut faire compliqué

    Posté par  (site web personnel) . Évalué à 2.

    Il y a la lib unique:
    http://log.emmanuelebassi.net/archives/2007/07/take-it-or-le(...)

    Elle te permet de choisir le backend que tu soihaite pour t'assurer que ton appli est lancée de manière unique: D-BUS, socket, X, etc.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.