web-dev-qa-db-fra.com

Script shell pour obtenir l'ID de processus sous Linux

Je veux écrire un script Shell (.sh fichier) pour obtenir un identifiant de processus donné. Ce que j'essaie de faire ici, c'est une fois que j'ai obtenu l'ID du processus, je veux tuer ce processus. Je cours sur Ubuntu (Linux).

J'ai pu le faire avec une commande comme

ps -aux|grep Ruby
kill -9 <pid>

mais je ne sais pas comment le faire via un script Shell.

27
sameera207

L'utilisation de grep sur les résultats de ps est une mauvaise idée dans un script, car une partie du temps correspondra également au processus grep que vous venez d'appeler. La commande pgrep évite ce problème, donc si vous avez besoin de connaître l'ID du processus, c'est une meilleure option. (Notez bien sûr que de nombreux processus peuvent correspondre.)

Cependant, dans votre exemple, vous pouvez simplement utiliser la commande similaire pkill pour tuer tous les processus correspondants:

pkill Ruby

Soit dit en passant, vous devez savoir que l'utilisation de -9 est exagéré (ho ho) dans presque tous les cas - il y a quelques conseils utiles à ce sujet dans le texte de la "Utilisation inutile de kill -9 lettre type ":

Non non Non. N'utilisez pas kill -9.

Cela ne donne pas au processus une chance de proprement:

  1. arrêter les connexions de socket
  2. nettoyer les fichiers temporaires
  3. informer ses enfants qu'il s'en va
  4. réinitialiser ses caractéristiques de terminal

et ainsi de suite et ainsi de suite et ainsi de suite.

En général, envoyez 15, et attendez une seconde ou deux, et si cela ne fonctionne pas, envoyez 2, et si cela ne fonctionne pas, envoyez 1. Si cela ne fonctionne pas, RETIREZ LE BINAIRE parce que le programme se comporte mal!

N'utilisez pas kill -9. Ne sortez pas la moissonneuse-batteuse juste pour ranger le pot de fleurs.

36
Mark Longair

Si vous allez utiliser ps et grep, vous devez le faire de cette façon:

ps aux|grep r[u]by

Ces crochets amèneront grep à sauter la ligne pour la commande grep elle-même. Donc, pour l'utiliser dans un script, faites:

output=`ps aux|grep r\[u\]by`
set -- $output
pid=$2
kill $pid
sleep 2
kill -9 $pid >/dev/null 2>&1

Les backticks vous permettent de capturer la sortie d'une commande dans une variable Shell. Le set -- analyse la sortie ps en mots, et $ 2 est le deuxième mot de la ligne qui se trouve être le pid. Ensuite, vous envoyez un signal TERM, attendez quelques secondes pendant Ruby pour s'éteindre, puis tuez-le sans pitié s'il existe toujours, mais jetez toute sortie car la plupart du temps, tuez - 9 se plaindra que le processus est déjà mort.

Je sais que je l'ai utilisé sans les barres obliques inverses avant les crochets, mais je viens de le vérifier sur Ubuntu 12 et il semble que cela soit nécessaire. Cela a probablement quelque chose à voir avec les nombreuses options de bash et la configuration par défaut sur différentes distributions Linux. J'espère que le [et] fonctionnera n'importe où mais je n'ai plus accès aux serveurs où je sais que cela a fonctionné sans barre oblique inverse, donc je ne peux pas en être sûr.

Un commentaire suggère grep-v et c'est ce que je faisais auparavant, mais quand j'ai appris la variante [], j'ai décidé qu'il était préférable de générer un processus de moins dans le pipeline.

18
Michael Dillon

Pour commencer, il n'est pas nécessaire de faire un ps -aux | grep... La commande pidof est bien meilleure à utiliser. Et ne fait presque jamais kill -9 voir ici

pour obtenir la sortie d'une commande en bash, utilisez quelque chose comme

pid=$(pidof Ruby)

ou utilisez pkill directement.

6
Fredrik Pihl

option -v c'est tres important. Il peut exclure une expression grep elle-même

par exemple.

ps -w | grep sshd | grep -v grep | awk '{print $1}' to get sshd id
4
user2223691

Cela fonctionne dans Cygwin mais il devrait également être efficace sous Linux.

ps -W | awk '/Ruby/,NF=1' | xargs kill -f

ou

ps -W | awk '$0~z,NF=1' z=Ruby | xargs kill -f

Pièges de Bash

3
Steven Penny

Vous pouvez utiliser la commande killall :

$ killall Ruby
2
Francisco R

C'est assez simple. Exécutez simplement n'importe quel programme comme ceci: - x = gedit & echo $! cela vous donnera le PID de ce processus. alors faites ce kill -9 $ x

0
abhishekrana