Przedstawię ci nieco skomplikowany przykład oparty na prawdziwym scenariuszu.
Problem
Powiedzmy, że polecenie conky
przestało odpowiadać na moim pulpicie i chcę go zabić ręcznie. Znam trochę Uniksa, więc wiem, że muszę wykonać polecenie kill <PID>
. W celu odzyskania PID, można użyć ps
lub top
czy cokolwiek narzędzie mój rozkład Unix mi dał. Ale jak mogę to zrobić za pomocą jednego polecenia?
Odpowiedź
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
ZASTRZEŻENIE: To polecenie działa tylko w niektórych przypadkach. Nie kopiuj / wklej go w swoim terminalu i zacznij go używać, może to nieświadomie zabić procesy. Naucz się raczej, jak go zbudować .
Jak to działa
1- ps aux
To polecenie wyświetli listę uruchomionych procesów i informacje o nich. Ciekawą informacją jest to, że wyświetli PID każdego procesu w drugiej kolumnie. Oto fragment danych wyjściowych polecenia na moim pudełku:
$ 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
Interesuje mnie tylko jeden proces, więc grep
znajduję wpis odpowiadający mojemu programowi 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
Jak widać w kroku 2, polecenie ps
wyświetla grep conky
proces na liście (w końcu jest uruchomionym procesem). Aby go przefiltrować, mogę uruchomić grep -v grep
. Ta opcja -v
mówi grep
o dopasowaniu wszystkich linii oprócz linii zawierających wzór.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Chciałbym znać sposób na wykonanie czynności 2 i 3 w jednym grep
połączeniu.
4- awk '{print $2}'
Teraz, gdy wyizolowałem proces docelowy. Chcę odzyskać jego PID. Innymi słowy, chcę odzyskać drugie słowo wyniku. Na szczęście dla mnie większość (wszystkich?) Współczesnych jednorożców dostarczy jakąś wersję awk
języka skryptowego, który robi cuda z danymi tabelarycznymi. Nasze zadanie staje się tak proste jak print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Mam PID. Wszystko czego potrzebuję to przekazać kill
. Aby to zrobić, użyję xargs
.
xargs kill
odczyta dane wejściowe (w naszym przypadku z potoku), utworzy polecenie składające się z kill <items>
( <items>
są czymkolwiek odczytane z danych wejściowych), a następnie wykona utworzone polecenie. W naszym przypadku zostanie wykonane kill 1948
. Misja zakończona sukcesem.
Ostatnie słowa
Zauważ, że w zależności od używanej wersji Uniksa niektóre programy mogą zachowywać się nieco inaczej (na przykład ps
mogą wyświetlać PID w kolumnie $ 3). Jeśli coś wydaje się niewłaściwe lub inne, przeczytaj dokumentację dostawcy (lub lepiej man
strony). Uważaj również, ponieważ długie rury mogą być niebezpieczne. Nie przyjmuj żadnych założeń, szczególnie podczas używania poleceń takich jak kill
lub rm
. Na przykład, jeśli istnieje inny użytkownik o nazwie „conky” (lub „Aconkyous”), moje polecenie może zabić wszystkie jego uruchomione procesy!
Mówię ostrożnie, szczególnie w przypadku długich rur. Zawsze lepiej jest budować go interaktywnie, tak jak my tutaj, niż zakładać i później żałować.