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.)


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


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.


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 ...


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`

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]

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

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


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.


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


6

Untuk membunuh dengan grep:

kill -9 `pgrep myprocess`

5

lebih tepatnya adalah:

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

1
Mengapa Anda exportvariabel yang hanya akan Anda gunakan sekali dalam proses yang sama?
tripleee


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

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.


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) .


Bagaimana saya mengaktifkan kembali tindakan yang dilakukan oleh enable -n kill?
Brethlosze

1
@hyprfrcbenable kill
The Vee



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.*
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.