Я збираюся провести вас через дещо складний приклад, заснований на реальному сценарії життя.
Проблема
Скажімо, команда 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
У мене є ПІД. Все, що мені потрібно, - це передати це kill
. Для цього я буду використовувати xargs
.
xargs kill
прочитає з входу (в нашому випадку з труби), сформує команду, що складається з kill <items>
(що <items>
б вона не читала з вводу), а потім виконає створену команду. У нашому випадку це буде виконано kill 1948
. Місія виконана.
Заключні слова
Зауважте, що залежно від того, яку версію unix ви використовуєте, деякі програми можуть поводитись трохи інакше (наприклад, ps
можуть виводити PID у стовпці $ 3). Якщо щось здається неправильним чи іншим, прочитайте документацію вашого постачальника (а краще, man
сторінки). Також будьте обережні, оскільки довгі труби можуть бути небезпечними. Не робіть жодних припущень, особливо при використанні таких команд як kill
або rm
. Наприклад, якщо був інший користувач з ім'ям «conky» (або «Aconkyous»), моя команда може також вбити всі його запущені процеси!
Що я кажу, будьте обережні, особливо для довгих труб. Завжди краще будувати його інтерактивно, як ми тут, ніж робити припущення і пізніше шкодувати.