2010-01-27 16 views
2

Je suis en train d'essayer d'écrire une fonction "tuer tous les autres processus démons" pour les utiliser dans un daemon bash. Je ne veux jamais plus d'un démon en même temps. Aucune suggestion? C'est ce que j'ai:Tuer d'autres démons bash à partir du même script

#!/bin/bash 

    doService(){ 
     while 
     do 
     something 
     sleep 15 
     done 
    } 

    killOthers(){ 
     otherprocess=`ps ux | awk '/BashScriptName/ && !/awk/ {print $2}'| grep -Ev $$` 

     WriteLogLine "Checking for running daemons." 

     if [ "$otherprocess" != "" ]; then 
      WriteLogLine "There are other daemons running, killing all others." 
      VAR=`echo "$otherprocess" |grep -Ev $$| sed 's/^/kill /'` 
      `$VAR` 
     else 
      WriteLogLine "There are no daemons running."  
     fi 
     } 


     killOthers 
     doService 

Cela fonctionne de temps en temps, pas d'autres. Il n'y a presque rien de cohérent.

Répondre

0

Si vous run votre serviceunderrunit - le service ne doit pas bifurquer dans l'arrière-plan - vous aurez une garantie il y a exactement un exemple de celui-ci en cours d'exécution. runit démarre le service s'il n'est pas en cours d'exécution ou s'il s'est arrêté ou s'est écrasé, l'arrête si vous le demandez, garde un fichier pid.

+0

hmmm, malheureusement je n'ai pas de runit non plus. Je cours une installation de vanilla OSX de non-devloper (aucun outils de xcode). –

+0

Il est probablement emballé quelque part, mais je laisserai les utilisateurs d'osx fournir un lien ou un équivalent. – Tobu

+0

J'ai également édité mon post original pour refléter cela: ce doc Apple Dev semble prometteur: http://developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/BPSystemStartup/Articles/StartupItems.html – monojohnny

1

Pourriez-vous essayer l'ancien tour 'fichier de verrouillage' ici? Testez un fichier: s'il n'existe pas, créez-le et lancez-le; sinon, quittez.

Comme:

#!/bin/bash 
LOCKFILE=/TMP/lockfile 
if [ -f "$LOCKFILE" ]; then 
     echo "Lockfile detected, exiting..." 
     exit 1 
fi 
touch $LOCKFILE 
while : 
do 
     sleep 30 
done 
rm $LOCKFILE # assuming an exit point here, probably want a 'trap'-based thing here. 

L'inconvénient est que vous devez nettoyer les fichiers de verrouillage de temps en temps, si un orphelin est laissé derrière. Pouvez-vous convertir cela en 'rc' (ou S */K * script?) De sorte que vous pouvez spécifier 'once' dans l'inittab (ou une méthode équivalente - pas sûr sur MacOS)?

Comme ce qui est décrit ici:

http://aplawrence.com/Unixart/startup.html

EDIT:

Peut-être cette pomme Doc pourrait aider ici:

http://developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/BPSystemStartup/Articles/StartupItems.html

+0

Je souhaite que le démon appelé le plus récemment soit celui qui reste actif. Je ne suis pas sûr que cette solution fonctionnerait pour ce que je prévois. –

2

Vous avez déjà éliminé le processus en cours ID en utilisant grep -v donc il n'y a aucune raison de le faire à nouveau quand vous publiez e kill. Il n'y a pas non plus de raison de construire le kill dans une variable. Il suffit de faire:

kill $otherprocess 

Mais pourquoi ne pas utiliser:

pkill -v $$ BashScriptName 

ou

pkill -v $$ $0 

sans grep.

Ensuite, vous pouvez faire:

if [[ $? ]] 
then 
    WriteLogLine "Other daemons killed." 
else 
    WriteLogLine "There are no daemons running." 
fi 
+0

Je n'ai pas l'option pkill ... le kill $ otherprocess ne semble pas fonctionner non plus. –