Je vais vous montrer un exemple un peu complexe, basé sur un scénario réel.
Problème
Disons que la commande a conky
cessé de répondre sur mon bureau et que je veux la tuer manuellement. Je connais un peu Unix, donc je sais que ce que je dois faire, c'est exécuter la commande kill <PID>
. Pour récupérer le PID, je peux utiliser ps
ou top
ou tout autre outil ma distribution Unix m'a donné. Mais comment puis-je faire cela en une seule commande?
Répondre
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
DISCLAIMER: Cette commande ne fonctionne que dans certains cas. Ne le copiez / collez pas dans votre terminal et ne commencez pas à l’utiliser, cela pourrait tuer des processus sans le savoir Apprenez plutôt comment le construire .
Comment ça marche
1- ps aux
Cette commande affichera la liste des processus en cours et des informations les concernant. L'information intéressante est qu'il va sortir le PID de chaque processus dans sa 2e colonne. Voici un extrait de la sortie de la commande sur ma boîte:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
Je ne suis intéressé que par un processus, je grep
recherche donc l'entrée correspondant à mon programme conky
.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
Comme vous pouvez le constater à l'étape 2, la commande ps
affiche le grep conky
processus dans sa liste (c'est un processus en cours d'exécution). Pour le filtrer, je peux courir grep -v grep
. L'option -v
indique de grep
faire correspondre toutes les lignes à l' exclusion de celles contenant le motif.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: J'aimerais savoir comment faire les étapes 2 et 3 en un seul grep
appel.
4- awk '{print $2}'
Maintenant que j'ai isolé mon processus cible. Je veux récupérer son PID. En d'autres termes, je veux récupérer le deuxième mot de la sortie. Heureusement pour moi, la plupart (tous?) Les ordinateurs modernes fourniront une version de awk
, un langage de script qui fait des merveilles avec des données tabulaires. Notre tâche devient aussi facile que print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
J'ai le PID. Tout ce dont j'ai besoin est de le transmettre kill
. Pour ce faire, je vais utiliser xargs
.
xargs kill
lit à partir de l'entrée (dans notre cas à partir du tube), forme une commande composée de kill <items>
( <items>
est ce qu'il lit à partir de l'entrée), puis exécute la commande créée. Dans notre cas, il va exécuter kill 1948
. Mission accomplie.
Mots finaux
Notez que, selon la version de votre système d'exploitation Unix utilisée, certains programmes peuvent se comporter légèrement différemment (par exemple, ps
le PID peut être généré dans la colonne $ 3). Si quelque chose semble faux ou différent, lisez la documentation de votre fournisseur (ou mieux, les man
pages). Faites également attention car de longs tuyaux peuvent être dangereux. Ne faites pas de suppositions, en particulier lorsque vous utilisez des commandes telles que kill
ou rm
. Par exemple, s'il y avait un autre utilisateur nommé 'conky' (ou 'Aconkyous'), ma commande pourrait également tuer tous ses processus en cours d'exécution!
Ce que je dis, c'est de faire attention, surtout pour les longues pipes. Il est toujours préférable de le construire de manière interactive comme nous l'avons fait ici, plutôt que de formuler des hypothèses et de vous sentir désolé plus tard.