2009-05-21 11 views
1

Je voudrais utiliser killall sur un processus du même nom à partir duquel killall sera exécuté sans tuer le processus engendrant le killall. Donc, plus en détail, disons que j'ai process foo, et le processus foo est en cours d'exécution. Je veux être capable de lancer "foo -k", et que le nouveau foo tue le vieux foo, sans se tuer.killall sur le processus du même nom

Répondre

4
pgrep foo | grep -v $$ | xargs kill 

Si vous n'avez pas pgrep, vous devrez trouver une autre façon de générer la liste des PIDs d'intérêt. Certaines options sont:

  1. Utilisez ps avec des options appropriées, suivi d'une combinaison de grep, sed et/ou awk pour correspondre aux processus et extraire le PIDs.

  2. killall peut envoyer un signal 0 au lieu de SIGTERM; la sémantique standard de ceci est qu'elle n'envoie pas de signal, mais détermine simplement si le processus est vivant ou non. Vous pouvez peut-être utiliser killall pour sélectionner la liste de processus et l'imprimer pour imprimer les PID des correspondants qui sont vivants. Cela nécessiterait probablement un peu de post-traitement avec sed.

  3. Le système de fichiers /proc de Linux contient peut-être des pseudo-fichiers contenant des données système que vous pouvez parcourir. Encore une fois, grep/awk/sed sont vos amis ici.

Si vous avez vraiment besoin de détails particuliers sur la façon de procéder, commentez ou envoyez-moi un courrier, et j'essaierai de développer certaines de ces options plus en détail.

[Edits:. Ajouté d'autres options pour ceux sans pgrep]

+0

Nice! J'aurais dû préciser cependant que cela doit pouvoir être fait dans le contexte de l'installation OS X par défaut, qui ne semble pas avoir de pgrep. – user53937

+0

A-t-il un pidof? – bdonlan

2

Cela semble fonctionner sur OS X:

killall -s foo | perl -ne 'system $_ unless /\b'$PPID'\b/' 

listes killall -s ce qu'il ferait, un PID à la fois. Fais ce qu'il ferait sauf te tuer.

+1

Notez que -s se comporte différemment sous Linux, alors faites attention si vous le portez dans le futur. – bdonlan

1

La manière habituelle de résoudre ce problème est d'avoir foo écrire son numéro d'identification de processus dans un fichier, dire quelque chose comme /var/run/foo.pid quand il est exécuté en mode démon . Ensuite, vous pouvez demander à la version non démon de lire le PID à partir du fichier PID et d'appeler directement le kill(2). C'est habituellement comment Apache et le genre le manipulent. Bien sûr, les nouveaux démons OSX passent par launchd(8) à la place, mais il y en a encore quelques-uns qui utilisent de bons vieux signaux.

Questions connexes