2010-02-08 15 views
5

czasami zrobić to w moim skorupy:Jak przekształcić wiele linii w jedną linię w bash-stdout?

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

$ kill -9 2681 2685 2689 4645 

Czy istnieje sposób mogę przekształcić wiele wierszy zawierających PID w jednej linii oddzielone spacjami? (Trochę irytujące jest wpisywanie PIDów za każdym razem i naprawdę chciałbym się nauczyć :))

Wielkie dzięki.

+4

Myślę, że xargs jest tym, czego szukasz: "ps aux | grep firefox | awk '{print $ 2}' | xargs kill -9". Nie mogę tego przetestować tutaj. – Tom

+4

możesz również chcieć spojrzeć na komendę 'killall' (niedostępną wszędzie) – cobbal

+3

Chcesz uniknąć używania' -9', chyba że jest to konieczne. Jeśli użyjesz tylko 'kill PID', daje to programowi szansę na oczyszczenie. Używaj tylko '-9', jeśli nie reaguje bez niego. –

Odpowiedz

11

Prosty sposób na to jest przy użyciu xargs

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

To wywoła polecenie kill PID ze wszystkich w tym samym czasie. (Dokładnie to, czego chcesz)

+0

Świetnie, wiedziałem wtedy :) – Tom

+0

Czasami takie procesy jak to się dzieje: '/ usr/bin/python/usr/share/PackageKit/helpers/yum/yumBackend.py get-files ... firefox; 5.0-2.fc15; x86_64; updates & ... 'i -9 spowoduje problemy (w tym przykładzie yum mógł uszkodzić bazy danych/pliki i przerywana aktualizacja) – yingted

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

Czy chodziło o 'pids =" $ pids $ pid "'? Nie widzę jak to działa ... –

+1

Dzięki działa jak urok :) – Zenet

2

Zamiast tego użyj pkill. Istnieje również pgrep.

To zrobi to, co chcesz i o ile łatwiej będzie Ci je zdobyć?

pkill firefox 

Używanie opcji -9 do pkill byłoby tym, co obecnie robisz; jednak należy unikać SIGKILL:

Nie używaj tego sygnału lekko. Proces nie będzie miał szansy na oczyszczenie. Może pozostawić po sobie osierocone procesy podrzędne, pliki tymczasowe, przydzielone blokady, aktywne segmenty pamięci współużytkowanej, zajęte gniazda i dowolną liczbę niespójności innych zasobów zasobów. Może to prowadzić do zaskakujących i trudnych do debugowania problemów w późniejszej eksploatacji systemu. [wlug.org]

I:

Nawiasem mówiąc, jest to jeden z powodów, nie należy rutynowo używać SIGKILL. SIGKILL powinien być używany tylko wtedy, gdy proces jest zawieszony i nie można go zabić w inny sposób. Jeśli użyjesz SIGTERM lub SIGINT w skrypcie pythona, zobaczysz, że mplayer opuści terminal w stanie UŻYTKOWNIKA. Jeśli używasz rutynowo przy użyciu programów SIGKILL, nie masz okazji, aby oczyścić wszystko, co może mieć negatywny wpływ na cały system w niektórych sytuacjach.

SIGTERM jest domyślnym sygnałem wysyłanym przez komendę kill shell. SIGINT to sygnał wysyłany z przerwania terminala (control-C). [debian.org]

+1

dzięki Roger, zajmuję się stronami man bardzo pomocnymi :) – Zenet

2

można to zrobić tylko z awk

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

Zgadzam się z wszystkich innych odpowiedzi dotyczące korzystania pkill, ale ... i zamiast używać xargs .. . można go rura do tr:

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

Ponadto, należy rozważyć użycie [f] tak że nie pasujesz do samego procesu grep.

Powiązane problemy