Saya akan memandu Anda melalui contoh yang agak rumit, berdasarkan skenario kehidupan nyata.
Masalah
Katakanlah perintah conky
berhenti merespons pada desktop saya, dan saya ingin membunuhnya secara manual. Saya tahu sedikit tentang Unix, jadi saya tahu apa yang perlu saya lakukan adalah menjalankan perintah kill <PID>
. Untuk mengambil PID, saya bisa menggunakan ps
atau top
alat apa pun yang diberikan distribusi Unix saya. Tetapi bagaimana saya bisa melakukan ini dalam satu perintah?
Menjawab
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
PENOLAKAN: Perintah ini hanya berfungsi dalam kasus-kasus tertentu. Jangan menyalin / menempelnya di terminal Anda dan mulai menggunakannya, itu bisa membunuh proses tanpa curiga. Alih-alih belajar bagaimana membangunnya .
Bagaimana itu bekerja
1- ps aux
Perintah ini akan menampilkan daftar proses yang sedang berjalan dan beberapa info tentangnya. Info yang menarik adalah bahwa ia akan menampilkan PID dari setiap proses di kolom ke-2. Berikut ini kutipan dari output perintah pada kotak saya:
$ 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
Saya hanya tertarik pada satu proses, jadi saya gunakan grep
untuk menemukan entri yang sesuai dengan program saya 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
Seperti yang Anda lihat di langkah 2, perintah ps
menampilkan grep conky
proses dalam daftar (setelah semua itu proses yang berjalan). Untuk memfilternya, saya bisa menjalankan grep -v grep
. Opsi -v
memberi tahu grep
untuk mencocokkan semua baris kecuali yang mengandung pola.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Saya ingin tahu cara melakukan langkah 2 dan 3 dalam satu grep
panggilan.
4- awk '{print $2}'
Sekarang saya telah mengisolasi proses target saya. Saya ingin mengambil PID-nya. Dengan kata lain saya ingin mengambil kata ke-2 dari output. Beruntung bagi saya, sebagian besar (semua?) Unix modern akan menyediakan beberapa versi awk
, bahasa scripting yang sangat menakjubkan dengan data tabular. Tugas kita menjadi semudah print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Saya punya PID. Yang saya butuhkan hanyalah meneruskannya kill
. Untuk melakukan ini, saya akan gunakan xargs
.
xargs kill
akan membaca dari input (dalam kasus kami dari pipa), membentuk perintah yang terdiri dari kill <items>
( <items>
apa pun itu dibaca dari input), dan kemudian jalankan perintah yang dibuat. Dalam kasus kami ini akan dieksekusi kill 1948
. Misi selesai.
Kata-kata terakhir
Perhatikan bahwa tergantung pada versi unix yang Anda gunakan, program tertentu mungkin berperilaku sedikit berbeda (misalnya, ps
mungkin menampilkan PID di kolom $ 3). Jika ada yang salah atau berbeda, baca dokumentasi vendor Anda (atau lebih baik, man
halaman). Juga hati-hati karena pipa panjang bisa berbahaya. Jangan membuat asumsi apa pun terutama ketika menggunakan perintah seperti kill
ataurm
. Sebagai contoh, jika ada pengguna lain bernama 'conky' (atau 'Aconkyous') perintah saya dapat membunuh semua proses yang berjalan juga!
Yang saya katakan adalah hati-hati, terutama untuk pipa panjang. Itu selalu lebih baik untuk membangunnya secara interaktif seperti yang kami lakukan di sini, daripada membuat asumsi dan merasa menyesal nanti.