Script Bash pour trouver et tuer un processus avec certains arguments?

17

Je veux un script qui tue les instances sshqui sont exécutées avec l'argument -D (configuration d'un proxy local).

Manuellement, je le fais ps -A | grep -i ssh, recherchez les instances avec -D, et kill -9 {id}chacune.

Mais à quoi cela ressemble-t-il sous forme de script bash?

(Je suis sur Mac OS X mais j'installerai toutes les commandes nécessaires via port)

Ricket
la source
Voir les alternatives pgrep et pkill sur mac os x? . pgrepet pkillsont des commandes pour rechercher ou tuer de manière fiable des processus par nom sous Solaris et Linux.
Gilles 'SO- arrête d'être méchant'

Réponses:

26

Exécutez pgrep -f "ssh.*-D"et voyez si cela renvoie l'ID de processus correct. Dans le cas contraire, il suffit de changer pgreppour pkillet garder les mêmes options et modèle

En outre, vous ne devez pas utiliser kill -9aka SIGKILL sauf si cela est absolument nécessaire car les programmes ne peuvent pas piéger SIGKILL pour nettoyer après eux-mêmes avant de quitter. Je n'utilise kill -9qu'après avoir essayé -1 -2et -3.

SiegeX
la source
vous devriez redéfinir kill comme une forboucle qui le fait kill -ipour chacun i;)
Seamus
1
pgrepn'est pas natif sur OSX, vous devez l'obtenir auprès d'un tiers. Le fil précédent sur le sujet contient des propositions et des alternatives.
Gilles 'SO- arrête d'être méchant'
homme vivant, plus j'utilise 'nix, plus je l'aime :) merci pour ça!
javamonkey79
pgrep et pkill sont disponibles dans OS X 10.8 (Mountain Lion) et supérieur. apple.blogoverflow.com/2012/07/…
Peter Hanley
Il peut être utile d'ajouter l' -aindicateur pgrepauquel il imprime non seulement l'identifiant du processus mais aussi la commande (y compris les arguments). De cette façon, il est très facile de vérifier que seuls les processus souhaités correspondent.
luator
1

Aussi,

kill `pgrep -f "ssh.*-D"`
Barun
la source
3
Je pense que cela équivaut àpkill
Michael Mrozek
0

Vous pouvez tirer parti du système de fichiers proc pour recueillir les informations. Par exemple:

for proc in $(grep -irl "ssh.*-D" /proc/*/cmdline | grep -v "self"); do if [ -f $proc ]; then cat $proc && echo ""; fi; done

Ce n'est pas parfait, vous voudrez une expression plus exclusive (surtout si vous tuez des processus) mais echo $proc | awk -F'/' '{ print $3 }'vous montrera le PID du ou des processus.

Tok
la source
1
OSX n'en a pas /proc. Et il existe déjà un outil robuste pour le faire, appelé pgrep(disponible en natif au moins sur Solaris et Linux).
Gilles 'SO- arrête d'être méchant'