Я собираюсь показать вам несколько сложный пример, основанный на сценарии из реальной жизни.
проблема
Допустим, команда conky
перестала отвечать на моем рабочем столе, и я хочу убить ее вручную. Я немного знаю Unix, поэтому я знаю, что мне нужно выполнить команду kill <PID>
. Для того , чтобы извлечь PID, я могу использовать ps
или top
или любой другой инструмент , мое распределение Unix дал мне. Но как я могу сделать это в одной команде?
Ответ
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Эта команда работает только в определенных случаях. Не копируйте / вставляйте его в свой терминал и не начинайте его использовать, это может привести к непредсказуемому завершению процессов. Скорее научитесь его строить .
Как это работает
1- ps aux
Эта команда выведет список запущенных процессов и некоторую информацию о них. Интересная информация заключается в том, что он выведет PID каждого процесса во втором столбце. Вот выдержка из вывода команды на моем ящике:
$ 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
Меня интересует только один процесс, поэтому я использую, grep
чтобы найти запись, соответствующую моей программе 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
Как вы можете видеть на шаге 2, команда ps
выводит grep conky
процесс в своем списке (в конце концов, это запущенный процесс). Для того, чтобы отфильтровать его, я могу запустить grep -v grep
. Опция -v
говорит, grep
чтобы соответствовать всем строкам, за исключением тех, которые содержат шаблон.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Я хотел бы знать, как выполнить шаги 2 и 3 за один grep
звонок.
4- awk '{print $2}'
Теперь, когда я изолировал свой целевой процесс. Я хочу получить его PID. Другими словами, я хочу получить 2-е слово вывода. К счастью для меня, большинство (все?) Современных систем предоставляют какую-то версию языка awk
сценариев, который творит чудеса с табличными данными. Наша задача становится такой же простой, как print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
У меня есть PID. Все, что мне нужно, это передать его kill
. Для этого я буду использовать xargs
.
xargs kill
будет читать из ввода (в нашем случае из канала), сформировать команду, состоящую из kill <items>
( <items>
независимо от того, будет ли она читать из ввода), а затем выполнить созданную команду. В нашем случае это выполнится kill 1948
. Миссия выполнена.
Заключительные слова
Обратите внимание, что в зависимости от того, какую версию unix вы используете, некоторые программы могут вести себя немного по-разному (например, ps
может выводить PID в столбце $ 3). Если что-то кажется неправильным или другим, прочитайте документацию вашего поставщика (или, лучше, man
страницы). Также будьте осторожны, так как длинные трубы могут быть опасны. Не делайте никаких предположений, особенно при использовании таких команд, как kill
или rm
. Например, если был другой пользователь с именем 'conky' (или 'Aconkyous'), моя команда может также убить все его запущенные процессы!
То, что я говорю, будьте осторожны, особенно для длинных труб. Всегда лучше построить это интерактивно, как мы делали здесь, чем делать предположения и сожалеть позже.