Cara anggun untuk membunuh proses

12

Setelah skrip bash saya selesai dengan server selenium, skrip tersebut membunuh seperti ini:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Meskipun ini berhasil dan tidak membunuh skrip selenium, ia juga mencoba untuk mematikan proses untuk grep seleniumJadi pada saat nomor proses kembali ke perintah kill, prosesnya hilang, sehingga akhirnya menghasilkan pesan kesalahan. (Dengan kata lain: pada akhirnya membunuh dua proses, salah satunya adalah server selenium nyata, yang lain adalah proses singkat yang merupakan efek samping dari bagaimana saya melakukan perintah ini.)

Apakah ada cara yang lebih anggun untuk membunuh proses itu, yang tidak memiliki efek samping yang tidak diinginkan ini?

(FWIW satu ide yang saya miliki: skrip yang sama ini memulai selenium sebelumnya dalam skrip, jadi mungkin jika ada cara saya bisa menangkap PID ketika saya memulai selenium, saya bisa menyimpannya dan membunuhnya secara langsung, alih-alih mencari-cari ID proses. Masalahnya adalah, saya tidak tahu cara mendapatkan PID itu, bagaimana menggunakan variabel untuk menyimpannya dan bagaimana cara merujuknya nanti dalam skrip. Tapi apakah itu cara yang lebih baik untuk melakukannya?)

Eric
sumber

Jawaban:

12

Cobalah untuk menggunakan pkill seleniumjika tidak ada ini, atau salah satu dari yang lain yang berhasil Anda dapat tetap menggunakan metode Anda dengan urutan pipa lain seperti

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`
Momo
sumber
pkill tidak berfungsi di server saya untuk ini, tetapi grep strip Anda yang ditingkatkan banyak membantu.
Eric
20

Coba pgrepperintah, yang akan menampilkan PID dari perintah yang Anda minati.

pgrep selenium

Untuk benar-benar mematikan proses, gunakan pkillperintah pendamping .

pkill selenium
mills013
sumber
Saya suka keanggunan ini, tetapi prosesnya terlihat seperti ini: "root 26401 11997 2 23:20 poin / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar "jadi saya baru saja mengubahnya pgrep javadan berfungsi :-) terima kasih!
Eric
2
Jika Anda memberi pgrep bendera '-f', itu akan cocok dengan pola terhadap seluruh baris perintah. Jadi, dalam hal ini kill pgrep -f seleniumseharusnya bekerja
mills013
7
menggunakan pkilljauh lebih sederhana. pkillmenggunakan kriteria pencocokan yang sama persis pgrep, sehingga Anda dapat melakukan ini dalam 1 perintah, bukan 2 (dan harus bergantung pada output dari satu).
Patrick
7

Coba gunakan grep [s]elenium. Ini tidak akan menemukan proses grep.

BillThor
sumber
Ini memang tipuan yang berguna. Mengapa ini berhasil?
2
@hesse - grepmenggunakan BREs secara default. Yaitu, [dan ]muncul argvuntuk grep, tetapi tidak cocok karena [dan ]tidak digunakan secara harfiah oleh grep.
Chris Down
Saya sering menggunakan | grep -v grepkomponen dalam pipa. Tapi ini cukup elegan dan saya menyukainya!
Alexios
Ini (seringkali) tidak cukup jika Anda memiliki file di direktori kerja saat ini dengan nama yang sama dengan proses yang Anda pilih. Jadi, solusi saya biasanya menggunakan adalah: ps -ef | grep \[s]elenium. Meskipun saya menemukan lsofalternatif yang jauh lebih baik untuk menggunakan psdan grep.
Moreaki
2

The killallperintah belum disebutkan, dan saya merasa itu adalah tambahan yang berguna untuk repertoar.

$ killall selenium

Anda juga dapat menggunakan -r regexopsi untuk menentukan ekspresi reguler agar cocok dengan nama proses, dan bahkan nilai waktu:

$ killall -o 5m selenium 

Membunuh semua proses selenium lebih dari 5 menit.

kwarrick
sumber
Itu tampaknya unik untuk versi non-RHEL / CentOSkillall
ewwhite
0

Gunakan -m 1sakelar dengan perintah grep untuk mengambil hanya proses pertama yang ditemukan. Selama Anda mengurutkan proses Anda dengan PID, naik, itu akan berhasil.

hellodanylo
sumber
1
Anda tidak dapat memastikan bahwa proses selenium menggunakan PID yang lebih rendah.
FJRA
FJRA, proses yang dimulai sebelumnya selalu mendapat PID yang lebih rendah. Karena server selenium dimulai sebelum 'grep selenium', itu akan mendapatkan PID yang lebih rendah.
hellodanylo