2010-02-08 9 views
5

Je fais parfois dans ma coquille:Comment transformer plusieurs lignes en une ligne dans bash stdout?

[email protected]:~/shell$ ps aux | grep firefox | awk '{print $2}' 
2681 
2685 
2689 
4645 

$ kill -9 2681 2685 2689 4645 

Est-il possible que je peux transformer les multiples lignes contenant les PIDs en une ligne séparés par des espaces? (Il est un peu ennuyeux de taper les PID à chaque fois et j'aimerais vraiment apprendre :))

Merci beaucoup.

+4

Je pense que xargs est ce que vous cherchez: "ps aux | grep firefox | awk '{print $ 2}' | xargs tue -9". Je ne peux pas tester ici. – Tom

+4

vous pouvez également vouloir regarder la commande 'killall' (pas disponible partout) – cobbal

+3

Vous voulez éviter d'utiliser' -9' à moins que ce soit nécessaire. Si vous n'utilisez que «kill PID», cela donne une chance au programme de faire le nettoyage. N'utilisez «-9» que s'il ne répond pas sans cela. –

Répondre

11

Le moyen facile pour cela est d'utiliser xargs

ps aux | grep firefox | awk '{print $2}' | xargs kill -9 

Cela invoquera la commande kill avec tous pid en même temps. (Exactement ce que vous voulez)

+0

Super, je le savais alors :) – Tom

+0

Parfois, des processus comme celui-ci vont être en cours d'exécution: '/ usr/bin/python/usr/share/PackageKit/helpers/yum/yumBackend.py get-fichiers ... firefox; 5.0-2.fc15; x86_64; mises à jour & ... 'et le -9 provoquera des problèmes (dans cet exemple, yum pourrait avoir des bases de données corrompues/fichiers et une mise à jour interrompue) – yingted

2
pids="" 
for pid in $(ps aux | grep firefox | awk '{print $2}') 
do 
pids=" $pid" 
done 
kill -9 $pids 
+3

Vouliez-vous dire 'pids =" $ pids $ pid "'? Je ne vois pas comment cela fonctionne ... –

+1

Merci fonctionne comme un charme :) – Zenet

2

Utilisez plutôt pkill. Il y a aussi un pgrep.

Cela fera ce que vous voulez, et combien plus simple pouvez-vous obtenir? L'utilisation de l'option -9 pour pkill correspond à ce que vous faites actuellement; cependant, évitez SIGKILL:

N'utilisez pas ce signal à la légère. Le processus n'aura aucune chance de nettoyer. Il peut laisser des processus enfants orphelins, des fichiers temporaires, des verrous alloués, des segments de mémoire partagée actifs, des sockets occupés et un nombre quelconque d'incohérences d'état de ressources. Cela peut conduire à des problèmes surprenants et difficiles à déboguer lors du fonctionnement ultérieur du système. [wlug.org]

Et:

D'ailleurs, cela est une raison pour laquelle vous ne devriez pas utiliser systématiquement SIGKILL. SIGKILL ne doit être utilisé que lorsqu'un processus est et ne peut être tué autrement. Si vous utilisez un SIGTERM ou un SIGINT dans le script python, vous verrez que mplayer laissera le terminal dans un état UTILISABLE. Si vous utiliser régulièrement les programmes SIGKILL n'avez aucune chance de de nettoyer quoi que ce soit et peut nuire à l'ensemble de votre système dans certaines situations.

SIGTERM est le signal par défaut envoyé par la commande kill shell. SIGINT est le signal envoyé par une interruption de terminal (contrôle-C). [debian.org]

+1

merci Roger, je suis à la recherche dans les pages man très utiles :) – Zenet

6
killall -9 firefox 
+0

fonctionne aussi :) merci! – Zenet

2

vous pouvez le faire avec juste awk

ps -eo pid,args | awk 'BEGIN{s="kill -9 "}$2~/bash/{s=s" "$1} END{system(s)}' 
2

Je suis d'accord avec toutes les autres réponses sur l'utilisation pkill, mais ... et au lieu d'utiliser xargs, .. . vous redirigeriez à tr:

kill $(ps aux | grep [f]irefox | awk '{print $2}' | tr '\n' ' ') 

, Pensez aussi à utiliser la [f] afin que vous ne correspondez pas au processus grep lui-même.

Questions connexes