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)


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.


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


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.


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'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.