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 mickabouille . Évalué à 7.
C'est comme ça que font tous les inits (ou presque) dans ma distrib.
# pid
Posté par Jean Meyrand . Évalué à 5.
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 Steve Azriel . Évalué à 2.
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 Obsidian . Évalué à 3.
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 David . Évalué à 1.
# Si le programme plante....
Posté par David . Évalué à 1.
A ce moment la il faudrait supprimer à la main le fichier , ce qui n'est pas très élégant.
[^] # Résultat
Posté par David . Évalué à 1.
#!/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 liberforce (site web personnel) . Évalué à 2.
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.