Menemukan ID suatu proses dan membunuhnya

16

Kapan pun saya harus membunuh proses latar belakang yang saya lakukan ps -e | grep <process_name>

Yang mencetak sesuatu seperti ini 1766 ? 00:00:13 conky, Lalu saya menggunakan ID proses untuk killitu seperti itu kill 1766.

Apakah ada cara saya bisa menyederhanakan ini? Buat lebih cepat? mengurangi jumlah pengetikan?

Gautam
sumber
1
Saya sudah mendapatkan jawaban yang saya inginkan, tetapi saya akan menunggu beberapa saat sebelum menerima sehingga masyarakat dapat memperoleh manfaat dari berbagai pilihan yang tersedia.
Gautam
Silakan membuat pertanyaan ini lebih umum jika mungkin sehingga lebih banyak orang bisa mendapat manfaat dari jawaban
Gautam

Jawaban:

18

(TL, DR: pgrep, pkill)

Banyak varian unix yang datang bersama pgrepdan pengiringnya pkill: Solaris , Linux (bagian dari utilitas proses standar , mungkin tidak ada dalam sistem Linux yang disematkan), FreeBSD , OpenBSD , NetBSD , ... tetapi hanya dari MacPort pada OS X , bukan AIX , dan hanya baru-baru ini di HP-UX . The pgreputilitas menunjukkan ID proses proses cocok dengan nama, user dan beberapa kriteria lainnya. Argumen untuk pgrepdiartikan sebagai regexp yang harus cocok dengan bagian dari nama yang dapat dieksekusi proses (kecuali Anda memberikan opsi untuk mengubah ini). Jika Anda menelepon, pkillbukanpgrep, utilitas mengirim sinyal alih-alih menampilkan ID proses.

Utilitas serupa lainnya adalah pidof . Di Linux , ini disediakan oleh SysVinit atau BusyBox (jadi Anda akan sering menemukannya di sistem Linux tertanam yang tidak memiliki pgrep); ada juga port pada varian unix lainnya. The pidofutilitas memiliki opsi lebih sedikit, itu kebanyakan hanya cocok seluruh nama file executable. Utilitas pengiringnya killallmengirimkan sinyal ke program yang cocok match.

¹ Waspadalah yang killallmemiliki arti berbeda pada Solaris dan kemungkinan varian unix lainnya; jangan mengetikkan killallroot pada Solaris.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Wow jawaban Anda sangat terperinci, lebih dalam, Terima kasih. Harap edit pertanyaan untuk mencocokkan jawaban jika memungkinkan.
Gautam
@ GautamK Saya tidak berpikir pertanyaannya perlu diperluas. Jika Anda melakukannya, silakan mengeditnya sendiri.
Gilles 'SO- stop being evil'
Dari jawaban dengan jumlah suara terbanyak Jawaban Anda memberi lebih banyak detail, jadi saya menerimanya
Gautam
8
  • killall ProcessName (ada kerugian dengan perintah ini karena Anda tidak selalu tahu nama proses suatu program).
  • pidof ProccessName dan kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Coba satu baris ini dan gunakan kembali itu membentuk sejarah bash Anda, atau lebih baik buat alias untuk itu.
Hanan N.
sumber
Yang kedua pidoftampaknya sedikit lebih mudah, tetapi masih butuh 2 langkah
Gautam
Saya dapat mencari / membuat perintah satu baris yang melakukan itu dalam satu langkah (dengan nama proses kasar) tetapi itu akan mengharuskan Anda untuk mengetikkan garis panjang (yang lebih sulit dari dua langkah di atas), atau Anda bisa mengetiknya sekali dan menggunakannya kembali membentuk sejarah.
Hanan N.
@ GautamK saya telah memperbarui jawabannya dengan opsi perintah tunggal.
Hanan N.
6

Sementara Hanan memiliki beberapa saran bagus, saya akan menambahkan pgrep/pkill . Mereka memungkinkan kontrol yang lebih baik atas proses yang Anda temukan, dan ekspresi reguler jika Anda tidak tahu proses yang tepat yang harus Anda bunuh.

PS Hanan pidofdapat diumpankan killlangsung dengan backticks:

kill `pidof processname`
Kevin
sumber
pkillpersis apa yang saya cari, saya sebagian besar waktu tahu nama proses, Sebagian besar conkyatau firefoxatau chromeatau sesuatu seperti itu. Terima kasih
Gautam
1

Bagaimana dengan ini -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Contoh:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Memperbarui:

Maaf, ini jelas tidak memenuhi persyaratan pengetikan yang kurang sehingga cara yang baik untuk melakukannya adalah dengan menambahkan functionke Anda .bashrc, .profileatau apa pun skrip startup. Fungsinya bisa seperti ini -

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

Setelah ditambahkan, Anda dapat dengan mudah menyampaikan nama proses Anda:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
jaypal singh
sumber