Temukan dan matikan proses dalam satu baris menggunakan bash dan regex


650

Saya sering harus mematikan proses selama pemrograman.

Cara saya melakukannya sekarang adalah:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

Bagaimana saya bisa mengekstrak id proses secara otomatis dan membunuhnya di baris yang sama?

Seperti ini:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

3
Percayalah padaku! : 'D Jawaban pertama yang Anda pilih jauh lebih kompleks daripada solusi yang Anda katakan dalam jawaban Anda. Saya lebih suka memilih jalan Anda.
Santosh Kumar

cara terbaik untuk memeriksa apakah ada proses: stackoverflow.com/questions/3043978/…
Trevor Boyd Smith

Jawaban:


1400

Di bash, Anda harus dapat melakukan:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

Rincian tentang cara kerjanya adalah sebagai berikut:

  • The psmemberi Anda daftar semua proses.
  • The grepfilter yang berdasarkan string pencarian Anda, [p]adalah trik untuk menghentikan Anda mengambil sebenarnya grepproses itu sendiri.
  • The awkhanya memberi Anda bidang kedua setiap baris, yang merupakan PID.
  • The $(x)sarana membangun untuk mengeksekusi xkemudian mengambil output dan meletakkannya di baris perintah. Output dari pspipeline di dalam yang membangun di atas adalah daftar ID proses sehingga Anda berakhir dengan perintah seperti kill 1234 1122 7654.

Berikut transkrip yang menunjukkannya dalam aksi:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

dan Anda bisa melihatnya mengakhiri semua tidur.


Menjelaskan grep '[p]ython csp_build.py'sedikit lebih detail:

Ketika Anda sleep 3600 &mengikuti ps -ef | grep sleep, Anda cenderung mendapatkan dua proses dengan sleepitu, sleep 3600dan grep sleep(karena mereka berdua ada sleepdi dalamnya, itu bukan ilmu roket).

Namun, ps -ef | grep '[s]leep'tidak akan membuat proses dengan sleepitu, malah menciptakan grep '[s]leep'dan inilah bagian yang sulit: yang greptidak menemukannya karena sedang mencari ekspresi reguler "setiap karakter dari kelas karakter [s](yang s) diikuti oleh leep.

Dengan kata lain, itu mencari sleeptetapi proses grep grep '[s]leep'yang tidak ada sleepdi dalamnya.

Ketika saya ditunjukkan ini (oleh seseorang di sini di SO), saya langsung mulai menggunakannya karena

  • itu satu proses kurang dari menambahkan | grep -v grep; dan
  • elegan dan licik, kombinasi langka :-)

2
@paxdiablo, bisakah Anda memberikan tautan untuk itu? Saya bingung mengapa ini berhasil.
glenn jackman

58
Anda hanya dapat menggunakan awk - ps aux | awk '/ [b] eam / {print $ 2}' , tidak perlu grep
Yola

20
Lebih baik menggunakan hanya pgrep atau pkill
NGix

2
Ada satu masalah kecil - jika prosesnya telah dihentikan, garis ini killakan bergolak dengan output standarkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Lionel Chan

5
Alih-alih grep '[p]ython csp_build.py'Anda juga dapat menggunakan: kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}'). grep -vmengembalikan garis yang tidak cocok.
usandfriends

138

jika Anda memiliki pkill,

pkill -f csp_build.py

Jika Anda hanya ingin menentang nama proses (alih-alih daftar argumen lengkap) maka tinggalkan -f.


1
Tidak ada yang terjadi ketika saya menguji ini.
Orjanp

8
gunakan pgrep dulu untuk memverifikasi Anda telah memahami proses yang benar. kemudian gunakan pkill lagi pada pola yang benar.
ghostdog74

18
+1. pgrepdan pkillbekerja selama Anda berhati-hati untuk menentukan proses dengan benar. Secara default hanya nama proses yang cocok, yang hampir pasti hanya "python" dalam kasus ini. Gunakan pgrep -f "python csp_build.py"untuk mencocokkan perintah penuh.
mr.spuratic

3
Anda mungkin perlu memaksa pembunuhan denganpkill -9 -f csp_build.py
studgeek

1
Ini benar-benar harus menjadi jawaban yang diterima dan terpilih; ini yang lainnya dengan semua canggung agak tidak perlu. Saya harap orang-orang yang menemukan halaman ini membaca di luar jawaban pertama itu.
Jason C

89

Satu liner:

ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

  • Cetak kolom 2: awk '{print $2}'
  • sudo adalah opsional
  • Jalankan kill -9 5124, kill -9 5373dll (kill -15 lebih anggun tapi sedikit lebih lambat)

Bonus:

Saya juga memiliki 2 fungsi cara pintas yang didefinisikan dalam .bash_profile saya (~ / .bash_profile untuk osx, Anda harus melihat apa yang berfungsi untuk mesin * nix Anda).

  1. kata kunci p
    • daftar semua proses P yang mengandung kata kunci
    • penggunaan misalnya: p csp_build, p pythondll

kode bash_profile:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. kata kunci ka
    • K penyakit A ll proses yang memiliki kata kunci ini
    • penggunaan misalnya: ka csp_build, ka pythondll
    • opsional tingkat membunuh misalnya: ka csp_build 15,ka python 9

kode bash_profile:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}

Pengingat - Jangan lupa untuk memulai kembali bash shell (terminal) untuk memuat fungsi-fungsi baru. ATAU berjalan source ~/.bash_profiledi shell saat ini untuk mengimpor fungsi-fungsi baru (ini yang saya sukai).
A20

Seperti banyak jawaban lain di sini, ini menderita secara monumental karena penggunaan yang tidak bergunagrep . Ingat, apa pun yang tampak seperti grep x | awk '{ y }'biasanya lebih baik dan sering lebih kuat jika Anda menggantinya denganawk '/x/ { y }'
tripleee

1
@tripleee situs web yang Anda tautkan milik Anda, bukan? Saya perhatikan Anda menghubungkan semua bagian berbagai komentar. Apakah Anda mencoba membangun SEO?
a20

Tidak, saya tidak tertarik pada SEO. Saya berharap untuk membangun kesadaran.
tripleee

1
.. dengan menautkan ke situs web Anda seolah-olah itu adalah situs otoritas yang didirikan. Bagus. Juga, grep lebih cepat .
20

16
killall -r regexp

-r, --regexp

Menafsirkan pola nama proses sebagai ekspresi reguler yang diperluas.


15

Coba gunakan

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

Harus mengubahnya sedikit. Ini berhasil. Terima kasih. :) ps aux | grep 'python csp_build.py' | kepala -1 | cut -d "" -f 5 | xargs kill
Orjanp

3
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs killbekerja untukku. thanx
Rasika Perera

Ingat, anak-anak, Awk dapat melakukan apa saja grep, dan sebagian besar sederhana dan elegan. Kasus sepele grep x y | awk '{ z }'selalu lebih baik ditulis awk '/x/ { z }' y- lihat juga penggunaan tidak bergunagrep .
tripleee

12

Anda dapat menggunakan hanya pkill '^python*'untuk membunuh proses regex.

Jika Anda ingin melihat apa yang akan Anda bunuh atau temukan sebelum membunuh cukup gunakan di pgrep -l '^python*'mana -l output juga nama proses. Jika Anda tidak ingin menggunakan pkill, gunakan saja:

pgrep '^python*' | xargs kill


8

Gunakan pgrep - tersedia di banyak platform:

kill -9 `pgrep -f cps_build`

pgrep -f akan mengembalikan semua PID dengan kebetulan "cps_build"


2
Jika sudah pgrep, Anda juga akan memilikinya pkill. Seperti biasa, jangan gunakankill -9 kecuali Anda tahu mengapa kill -15(default) atau kill -2tidak akan berfungsi.
tripleee

Ini terlihat seperti parafrase yang lebih buruk dari jawaban @ nathanael yang menghilangkan salah arah -9dan menggunakan sintaks substitusi perintah modern yang tepat. Lebih baik memilih itu; meskipun tentu saja, pkilljawabannya tetap lebih baik.
tripleee

@tripleee Dalam kasus ini, bunuh -9 adalah apa yang saya inginkan - hentikan semua pelaku dengan prasangka ekstrem. Selain itu, saya telah menggunakan kill -9 selama bertahun-tahun tanpa masalah. Menurut pendapat saya, akan selalu ada kubu puritan vs kubu realis yang dikerjakan-sendiri, dan saya milik yang terakhir (dalam hal ini).
a20

Apakah Anda melewatkan bagian "kecuali Anda tahu mengapa"? Saya semua ingin menyelesaikan sesuatu, tetapi ini adalah salah satu cara umum menembak diri sendiri sampai Anda mengerti apa arti -9sebenarnya.
tripleee

@ tripleee, hei tripleee, saya baru-baru ini menemukan bahwa Anda benar, membunuh -15 adalah pilihan yang lebih baik karena memberikan kesempatan aplikasi untuk membunuh dirinya sendiri dengan anggun. Saya telah mengubah kode saya sesuai: stackoverflow.com/a/30486159/163382
a20

7

Ini akan mengembalikan pid saja

pgrep -f 'process_name'

Jadi untuk mematikan proses apa pun dalam satu baris:

kill -9 $(pgrep -f 'process_name')

atau, jika Anda tahu nama pasti prosesnya, Anda juga dapat mencoba pidof:

kill -9 $(pidof 'process_name')

Tapi, jika Anda tidak tahu persis nama prosesnya, pgrepakan lebih baik.

Jika ada beberapa proses yang berjalan dengan nama yang sama, dan Anda ingin mematikan yang pertama, maka:

kill -9 $(pgrep -f 'process_name' | head -1)

Juga perlu dicatat bahwa, jika Anda khawatir tentang sensitivitas huruf maka Anda dapat menambahkan opsi -i seperti di grep. Sebagai contoh:

kill -9 $(pgrep -fi chrome)

Info lebih lanjut tentang sinyal dan pgrep di man 7 signalatau man signaldanman pgrep


5

Anda dapat melakukannya dengan awk dan backtics

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

$ 2 dalam awk mencetak kolom 2, dan backtics menjalankan pernyataan yang dicetak.

Tetapi solusi yang jauh lebih bersih adalah proses python untuk menyimpan proses id-nya di / var / run dan kemudian Anda cukup membaca file itu dan membunuhnya.


Bukankah Anda akan membunuh proses 5124 dan 5373? Saya kira ini bukan masalah.
Orjanp

seharusnya tidak menjadi masalah, tetapi Anda selalu dapat menambahkan grep lain untuk mengecualikan proses grep: "grep -v grep" antara grep dan awk
Alexander Kjäll

Diuji dengan perintah yang sedikit dimodifikasi. Tapi itu tidak mematikan prosesnya, hanya dicetak kill <pid>. ps auxf | grep '[p] ython csp_build.py' | awk '{print "kill" $ 2}'
Orjanp

Hanya perlu menukar cetakan "kill" pernyataan $ 2 dengan sistem ("bunuh" $ 2). Lalu berhasil. :)
Orjanp

5

Tugas saya adalah membunuh semua yang cocok regexp yang ditempatkan di direktori tertentu (setelah tes selenium tidak semuanya dihentikan). Ini bekerja untuk saya:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done

The -9pilihan killmungkin terlalu agresif. Itu tidak memungkinkan mereka untuk membebaskan sumber daya mereka.
Birei

Bagus! Satu-satunya yang mempertimbangkan fakta bahwa mungkin ada lebih dari satu proses pencocokan! Satu catatan kecil: mungkin Anda mungkin ingin menambahkan "grep -v grep" atau sesuatu seperti itu ke pipa, untuk memastikan bahwa proses grep itu sendiri tidak muncul dalam daftar proses Anda.
Brad Parks

killmenerima banyak proses sehingga loop pada dasarnya tidak berguna; dan sebagaimana disebutkan di bagian lain halaman ini, Anda tidak boleh menggunakan kill -9kecuali Anda tahu bahwa prosesnya tidak akan merespons dengan adil kill.
tripleee

hapus -9 bukan masalah besar, mengapa downvote. Anda sebaiknya mengedit jawabannya.
Serge

5

Untuk mematikan proses dengan kata kunci midori, misalnya:

kill -SIGTERM $(pgrep -i midori)


3

Metode yang hanya menggunakan awk(dan ps):

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

Dengan menggunakan pengujian kesetaraan string saya mencegah pencocokan proses ini sendiri.


Untuk beberapa alasan saya tidak mendapatkan hit di "python csp_build.py". Tapi "python" sendiri yang berhasil.
Orjanp

3
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

Tidak dapat memberi +1 karena batas harian, tetapi menggunakan psdengan -oopsi layak digunakan.
P Shved

ps jangan beri saya banyak. [~] $ ps PID TTY TIME CMD 6365 poin / 6 00:00:00 ps 29112 poin / 6 00:00:00 bash
Orjanp

3

Berikan -f untuk pkill

pkill -f /usr/local/bin/fritzcap.py

path yang tepat dari file .py adalah

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m

2

Saya mulai menggunakan sesuatu seperti ini:

kill $(pgrep 'python csp_build.py')

1

Bunuh proses kita sendiri mulai dari PPID umum cukup sering, pkill yang terkait dengan –Pbendera adalah pemenang bagi saya. Menggunakan contoh @ ghostdog74:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30

1

Anda tidak perlu saklar pengguna untuk ps.

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

1

Dalam beberapa kasus, saya ingin membunuh proses secara simultan seperti ini:

➜ ~ tidur 1000 &
[1] 25410
➜ ~ tidur 1000 &
[2] 25415
➜ ~ tidur 1000 &
[3] 25421
➜ ~ pidof tidur
25421 25415 25410
➜ ~ bunuh `pidof sleep`
[2] - 25415 dihentikan tidur 1000                                                             
[1] - 25410 tidur dihentikan 1000
[3] + 25421 tidur 1000 yang dihentikan

Tapi, saya pikir itu sedikit tidak pantas dalam kasus Anda. (Mungkin ada menjalankan python a, python b, python x ... di latar belakang.)


1

Jika pkill -f csp_build.pytidak mematikan proses, Anda dapat menambahkan -9untuk mengirim signall kill yang tidak akan diabaikan. yaitupkill -9 -f csp_build.py


1

Solusinya adalah memfilter proses dengan pola yang tepat, mengurai pid, dan menyusun daftar argumen untuk menjalankan proses kill:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

Penjelasan dari dokumentasi:

utilitas ps menampilkan baris header, diikuti oleh baris yang berisi informasi tentang semua proses Anda yang memiliki terminal pengendali.

-e Menampilkan informasi tentang proses pengguna lain, termasuk yang lainnya

-f Menampilkan uid, pid, parent pid, penggunaan CPU terbaru, proses mulai

The grep pencarian utilitas setiap diberikan input file, memilih garis yang

-e pattern, --regexp = pattern Menentukan pola yang digunakan selama pencarian input: jalur input dipilih jika cocok dengan salah satu pola yang ditentukan. Opsi ini paling berguna ketika beberapa opsi -e digunakan untuk menentukan beberapa pola, atau ketika suatu pola dimulai dengan tanda hubung (`- ').

xargs - membuat daftar argumen dan menjalankan utilitas

kill - terminate atau isyarat suatu proses

sinyal nomor 9 - KILL (non-catchable, non-ignorable kill)

Contoh :

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

0

Saya menggunakan ini untuk membunuh Firefox ketika skrip dibanting dan cpu bashing :) Ganti 'Firefox' dengan aplikasi yang ingin Anda mati. Saya di shell Bash - OS X 10.9.3 Darwin.

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)


Mengganti grep Firefox | awk 'NR == 1 { next } ...'dengan awk 'NR == 1 || $11 !~ /Firefox/ { next } ...'tidak hanya menghemat proses, tetapi juga meningkatkan presisi. Tidak sulit untuk menyingkirkan sort | uniqdalam murni AWK baik (sedangkan tentu saja uniq | sorthanya salah - itu akan lewatkan setiap duplikat yang tidak berdekatan, dan menyembunyikan kesalahan dengan sia-sia menyortir keluaran dari uniq).
tripleee

0

Saya menggunakan gkill processname, di mana gkill adalah skrip berikut:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

CATATAN: TIDAK akan membunuh proses yang memiliki "grep" di baris perintah mereka.


1
Seperti banyak, banyak reinvention lain dari gudang yak, ini penuh dengan penggunaan yang tidak bergunagrep dan antipattern script umum shell.
tripleee

-1

Perintah berikut akan berguna:

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

misalnya., ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

Jika prosesnya masih macet, gunakan ekstensi "-9" ke hardkill, sebagai berikut:

kill -9 $(ps -elf | grep top| awk {'print $4'})

Semoga itu bisa membantu ...!


-1

Temukan dan bunuh semua proses dalam satu baris di bash.

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'- Memberikan daftar detail proses yang berjalan (uname, pid, dll) yang cocok dengan pola. Daftar keluaran termasuk grepperintah ini juga yang mencarinya. Sekarang untuk membunuh kita perlu mengabaikan grepproses perintah ini .
  • ps -ef | grep '<exec_name>' | grep -v 'grep'- Menambahkan grep lain dengan -v 'grep'menghapus proses grep saat ini.
  • Kemudian gunakan awkget id proses sendiri.
  • Kemudian simpan perintah ini di dalam $(...)dan meneruskannya ke killperintah, untuk membunuh semua proses.

-1

Anda dapat menggunakan perintah di bawah ini untuk mendaftar pid dari perintah. Gunakan top atau lebih baik gunakan htop untuk melihat semua proses di linux. Di sini saya ingin membunuh proses bernama

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

Dan verifikasi pid itu. Itu harus tepat. Untuk membunuh mereka gunakan perintah kill.

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

Misalnya: - berasal dari daftar proses htop.

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

Ini menyelesaikan masalah saya. Selalu siap untuk memulai kembali proses jika Anda secara tidak sengaja mematikan suatu proses.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.