Bagaimana saya bisa membunuh proses dengan nama alih-alih PID?

349

Kadang-kadang ketika saya mencoba untuk memulai Firefox dikatakan "proses Firefox sudah berjalan". Jadi saya harus melakukan ini:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

Yang saya suka adalah perintah yang akan melakukan semua itu untuk saya. Itu akan mengambil string input dan grepuntuk itu (atau apa pun) dalam daftar proses, dan akan membunuh semua proses dalam output:

jeremy@jeremy-desktop:~$ killbyname firefox

Saya mencoba melakukannya dalam PHP tetapi exec('ps aux')tampaknya hanya menunjukkan proses yang telah dieksekusi exec()dalam skrip PHP itu sendiri (jadi satu-satunya proses yang ditampilkan adalah dirinya sendiri.)

Jeremy Ruten
sumber
Ketika saya mendapatkan jendela yang mengatakan bahwa Firefox sudah berjalan saya biasanya hanya perlu menunggu satu detik dan saya dapat menjalankan Firefox lagi (tentu saja mungkin tidak selalu demikian).
nuoritoveri
1
Ini adalah cara teraman seperti yang dikatakan JohnB dalam jawaban ini: stackoverflow.com/questions/6381229/…
tecnoshopbq
Ini adalah pertanyaan lama, tetapi bisakah Anda mengubah jawaban yang diterima? Yang Anda tandai gagal dengan banyak proses, seperti yang dijalankan oleh JVM.
Luís de Sousa
Bagi siapa pun yang mereferensikan topik ini, dalam komentar di atas, Luis mereferensikan jawaban di bawah ini yang mempromosikan pkill -f "Process name"perintah ...
Digger

Jawaban:

505
pkill firefox

Informasi lebih lanjut: http://linux.about.com/library/cmd/blcmdl1_pkill.htm

shoosh
sumber
7
Menggunakan pgrep untuk mencari tahu apa yang Anda bunuh sebelum pergi berkeliling proses pembunuhan adalah Good Thing. Terutama saat menggunakan -f.
Akrikos
pkill isnt sangat ramah. Anda tidak bisa memberikan nama dengan cara yang sama seperti yang diambil oleh mereka.
Octopus
2
pkill -U <username>cukup berguna. Saya memiliki server web Solaris , daemon server web yang sebenarnya, diatur sebagai Layanan dengan pengguna itu sendiri. Jadi menetapkan oleh pengguna adalah cara sederhana / mudah untuk memicu restart.
Raystorm
6
Untuk memaksa membunuh: pkill -9 firefox
Justas
Ini berfungsi separuh dari waktu terbaik. Anda memerlukan setidaknya -fbendera untuk solusi omnibus.
Luís de Sousa
112

Juga dimungkinkan untuk menggunakan:

pkill -f "Process name"

Bagi saya, itu bekerja dengan sempurna. Itu yang saya cari. pkill tidak bekerja dengan nama tanpa bendera.

Ketika -fdiatur, baris perintah penuh digunakan untuk pencocokan pola.

Pemenang
sumber
2
khusus untuk menjalankan sesuatu dengan anggur yang -fpilihan benar-benar diperlukan. misalnyapkill -f "EvilWindowsServer.exe"
CodeBrauer
Ini harus menjadi jawaban yang diterima. Jawaban pertama gagal dengan banyak jenis program, misalnya yang berjalan pada JVM.
Luís de Sousa
1
Saya harus menambahkan -fbendera juga karena membunuh proses latar belakang menjalankan skrip Python.
Mason
dalam kasus saya, saya membutuhkan 2 bendera:pkill -f -9 PROCESSNAME
Slavik
kerjanya di centos7.thank
sirmagid
64

Anda dapat membunuh proses dengan nama dengankillall <name>

killall mengirimkan sinyal ke semua proses yang menjalankan perintah yang ditentukan. Jika tidak ada nama sinyal yang ditentukan, SIGTERM dikirim.

Sinyal dapat ditentukan baik dengan nama (misalnya -HUP atau -SIGHUP ) atau dengan nomor (misalnya -1 ) atau dengan opsi -s .

Jika nama perintah bukan ekspresi reguler (opsi -r ) dan berisi garis miring (/), proses yang mengeksekusi file tertentu akan dipilih untuk dibunuh, terlepas dari namanya.

Tetapi jika Anda tidak melihat prosesnya ps aux, Anda mungkin tidak akan memiliki hak untuk membunuhnya ...

Andre Bossard
sumber
6
Untuk memaksa penghentian suatu program yang tidak merespons, kirim KILL alih-alih JANGKA:killall -s KILL firefox
Martin Hansen
45

Alternatif yang sedikit lebih lama:

kill `pidof firefox`
Walter
sumber
25
pidof firefox | xargs kill -9
hbt
1
ini berfungsi di busybox untuk perangkat yang disematkan :)
nwgat
25

Cara termudah untuk dilakukan adalah memeriksa dulu Anda mendapatkan ID proses yang benar dengan:

pgrep -f [part_of_a_command]

Jika hasilnya seperti yang diharapkan. Pergi dengan:

pkill -f [part_of_a_command]
Tahsin Turkoz
sumber
19

Aneh, tapi saya belum melihat solusinya seperti ini:

kill -9 `pidof firefox`

itu juga dapat membunuh banyak proses (beberapa pids) seperti:

kill -9 `pgrep firefox`

Saya lebih suka pidofkarena memiliki output garis tunggal:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316
prosti
sumber
Ketika saya menjalankan ini, saya mendapat kesalahan kill: invalid number 'pidof myprogram'. Apa yang buruk di sini?
Brethlosze
ini hanya menyelamatkan hidup saya hari ini ... Saya tidak ingin menulis lagi tetapi saya senang saya menemukannya di sini. Terima kasih sobat.
MilMike
1
Datang terlambat tetapi kalau-kalau ada orang lain yang bertanya-tanya ... @Brethlosze Anda memasukkan kutu tunggal, sedangkan perintah membutuhkan backticks.
spektra
Terima kasih! .. saya akan (dan saya sedang) mengetahui backticks ini :)
Brethlosze
13

Bunuh semua proses yang ada snippetdi jalur startup. Anda dapat membunuh semua aplikasi yang dimulai dari suatu direktori dengan menempatkan / direktori / sebagai cuplikan. Ini cukup berguna ketika Anda memulai beberapa komponen untuk aplikasi yang sama dari direktori aplikasi yang sama.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Saya lebih suka pgrep jika tersedia

Mike
sumber
1
Ini adalah kombinasi yang sering terlihat dari antipatterns. Gunakan regex yang tidak cocok dengan dirinya sendiri (atau nama skrip yang mengandung) dan hindari yang tidak bergunagrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee
1
sambil menghindari grep yang tidak berguna, Anda tidak menghindari kesalahan ketik dan kemampuan untuk menggunakan perintah dalam proses otomatis yang menjadikan parameter <snippet>
Mike
Ini memang cara terbaik untuk melakukannya!
Abhinandan Dubey
Akan bagus untuk memahami mengapa @ tripleee [s]bekerja dalam hal tidak cocok dengan proses awk itu sendiri?
andig
Karena regex [x]ycocok dengan string xytetapi tidak sebaliknya. Ini adalah FAQ umum. Tautan ini ke halaman lebih dari 20 tahun yang lalu yang menjelaskan hal ini secara lebih rinci; dan ini sudah merupakan pertanyaan berulang.
tripleee
11

Di Mac saya tidak dapat menemukan pgrep dan pkill juga tidak berfungsi, jadi tuliskan satu skrip liner sederhana: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Jika ada cara yang lebih mudah untuk melakukan ini maka silakan bagikan.

Dhiraj
sumber
1
Lol. Ini adalah perintah gila untuk tugas seperti itu. Sudahlah. Apakah Anda memanggil satu saluran sederhana itu? : D Simple adalah killall
m3nda
@ erm3nda :-) Setuju. Melihat ke belakang itu terlihat gila. Tidak dapat mengingat mengapa killall tidak bekerja pada mac saya saat itu.
Dhiraj
Ini sangat berguna ketika Anda ingin membunuh proses Java tertentu seperti "jboss". Dalam hal ini, killall tidak membantu.
Jan M 15
9

Menggunakan #killallperintah:

#killall -9 <processname>
pengguna2396265
sumber
6

Untuk membunuh dengan grep:

kill -9 `pgrep myprocess`
edW
sumber
5

lebih tepatnya adalah:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid
Chadiso
sumber
1
Mengapa Anda exportvariabel yang hanya akan Anda gunakan sekali dalam proses yang sama?
tripleee
4

Saya biasanya menggunakan killallperintah.

Periksa tautan ini untuk perincian perintah ini.

Bittercoder
sumber
3

Saya bertanya pada diri sendiri pertanyaan yang sama tetapi masalah dengan jawaban saat ini adalah bahwa mereka tidak aman memeriksa proses untuk dibunuh sehingga ... itu dapat menyebabkan kesalahan besar:) ... terutama jika beberapa proses cocok dengan pola .

Sebagai penafian, saya bukan profesional dan pasti ada ruang untuk perbaikan.

Jadi saya menulis skrip sh kecil:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi
Hebat
sumber
2

Jika Anda menjalankan GNOME, Anda dapat menggunakan monitor sistem (System-> Administration-> System Monitor) untuk mematikan proses seperti yang Anda lakukan pada Windows. KDE akan memiliki sesuatu yang serupa.

Bernard
sumber
2

killPerintah default menerima nama perintah sebagai alternatif untuk PID. Lihat membunuh (1) . Masalah yang sering terjadi adalah bashmenyediakan sendiri killyang menerima nomor pekerjaan, seperti kill %1, tetapi bukan nama perintah. Ini menghalangi perintah default. Jika fungsi sebelumnya lebih bermanfaat bagi Anda daripada yang terakhir, Anda dapat menonaktifkan bashversi dengan memanggil

enable -n kill

Untuk info lebih lanjut, lihat killdan enableentri dalam bash (1) .

Vee
sumber
Bagaimana saya mengaktifkan kembali tindakan yang dilakukan oleh enable -n kill?
Brethlosze
1
@hyprfrcbenable kill
The Vee
1

kill -9 $ (ps aux | grep -e myprocessname | awk '{print $ 2}')

Nived Thanima
sumber
0
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $
query_port
sumber
0

awk oneliner, yang mem-parsing header psoutput, jadi Anda tidak perlu peduli dengan nomor kolom (tetapi nama kolom). Mendukung regex. Misalnya, untuk mematikan semua proses, yang nama yang dapat dieksekusi (tanpa jalur) berisi kata "firefox" coba

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
Andrey Bochkov
sumber