“Kill <PID>” tidak benar-benar mematikan prosesnya, mengapa?


118

Saya mencoba untuk meningkatkan keterampilan baris perintah saya dan saya telah mengalami masalah di mana saya tidak dapat membunuh proses. Saya mengetik di kill 2200mana 2200 adalah PID saya dan prosesnya tidak terbunuh. Setelah beberapa menit menunggu masih dalam topdan ps aux. Saya bahkan sudah mencoba mengetiknya dengan sudo - tidak ada hasil.

Adakah ide mengapa bisa seperti itu?


SUNTING

Saya telah menemukan ketergantungan aneh, di mana fgmemperbarui daftar proses:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

Proses apa itu? Apakah Anda memeriksa apakah prosesnya mungkin tidak berfungsi ? Dalam hal ini Anda harus membunuh proses induk.
htorque

Prosesnya adalah top(sebagaimana tercantum dalam edit). Saya hanya ingin mencoba meletakkan program untuk bekerja ke latar belakang dan kemudian membawanya kembali.
Patryk

2
Jika Anda menunda proses dengan CTRL-z, itu akan memblokir sebagian besar sinyal selama itu ditangguhkan (yaitu sampai Anda melakukan fgatau bguntuk proses tersebut)
nos

Jawaban:


179

Proses dapat mengabaikan beberapa sinyal. Jika Anda mengirim SIGKILL, ia tidak akan dapat mengabaikannya (dan tidak menangkapnya untuk melakukan pembersihan). Mencoba:

kill -9 {PID}

Pelajari lebih lanjut dengan membaca halaman manual:

man kill

22
juga perhatikan bahwa dalam beberapa keadaan yang sangat spesifik , suatu proses dapat dalam keadaan zombie / mati yang bahkan SIGKILL tidak dapat membunuh proses tersebut. Dalam hal ini, Anda harus menemukan proses induk dan membunuh proses induk.
Lie Ryan

15
Jika proses itu keluar dari jalur maka MEMBUNUH SEMBILAN SEMBILAN !
scottl

4
Dan terkadang tidak ada proses induk, dalam hal ini Anda baru saja kacau. Satu-satunya cara untuk menghapus proses seperti itu adalah me-reboot mesin.
user606723

2
Nama perintah kill terus menyesatkan bagi banyak, banyak pengguna (termasuk saya di awal). Seseorang berasumsi bahwa ketika Anda mengatakan "bunuh X" ini berarti benar-benar membunuh X dan tidak melakukan hal lain. Saya mengerti ini tidak akan mengubah apa-apa tapi saya berharap mereka telah memilih nama yang lebih rumit ...
rbaleksandar

1
Apa yang dilakukan bahkan setelah kill -9itu tidak berhasil dan prosesnya masih berkeliaran?
Douglas Gaskell

42

Jika killdipanggil tanpa parameter apa pun, ia mengirimkan nomor sinyal 15 ( SIGTERM). Sinyal ini dapat diabaikan oleh proses. Sinyal ini memberi tahu proses untuk membersihkan barang-barangnya dan kemudian mengakhiri dengan benar sendiri. Itu cara yang bagus.

Anda juga dapat "mengirim" nomor sinyal 9 ( SIGKILL) yang tidak dapat diabaikan oleh proses. Prosesnya bahkan tidak akan mengenalinya, karena kernel mengakhiri proses, bukan proses itu sendiri. Itu cara yang jahat.

Satu kata kill -9 <pid>selalu berhasil. Itu salah kaprah . Ada situasi di mana bahkan kill -9tidak mematikan proses. Misalnya ketika suatu proses memiliki status D(tidur tidak terputus). Suatu proses masuk ke kondisi ini setiap kali menunggu I / O (biasanya tidak terlalu lama). Jadi, jika suatu proses menunggu I / O (pada harddisk yang rusak misalnya) dan itu tidak diprogram dengan benar (dengan batas waktu), maka Anda tidak bisa mematikan proses itu . Apa pun yang Anda lakukan. Anda hanya dapat mencoba membuat file dapat diakses sehingga proses berlanjut.


2
Ini sangat membantu, saya telah mengalami ini beberapa kali karena menggantung akses I / O pada disk jaringan dan saya bertanya-tanya mengapa saya tidak bisa membunuh proses yang membeku. Apakah ada lebih banyak dokumentasi tentang masalah khusus ini dan bagaimana cara mengatasinya?
Sheljohn

7

Meskipun namanya kill tidak benar-benar membunuh proses, ia mengirimkan sinyal ke sana. Dari halaman manual:

kill - send a signal to a process

Sinyal default yang dikirim oleh kill [pid]adalah SIGTERM yang biasanya tetapi tidak selalu meminta proses untuk mengakhiri. Sangat mungkin untuk menulis program yang memainkan nada senang ketika Anda mengirim sinyal SIGTERM ke sana, tetapi tidak disarankan.

Sinyal umum lainnya adalah SIGHUP yang sering digunakan untuk meminta program membaca ulang file konfigurasinya.

Jika Anda benar-benar ingin mematikan suatu program, Anda harus menggunakan sinyal SIGKILL dengan melakukan kill -9 [pid].


2

Sepertinya Anda mungkin menangguhkan suatu proses (mungkin dengan menekan Ctrl-Z di terminal). Dalam keadaan ini, proses Anda tidak akan menanggapi SIGTERM karena dibekukan. Menjalankan 'fg' melelehkan prosesnya, sehingga dapat mengambil sinyal dan mengakhiri sendiri. Itu bisa menjelaskan mengapa 'fg' muncul untuk memperbarui daftar proses.


1
Jadi bagaimana cara menemukan terminal yang terpasang?
ruX

0

Dari dalam C ++, saya mengeksekusi:

kill(4024, SIGKILL);

Dan di terminal linux (Ubuntu),

$ ps -ax | grep my_su

Outputnya adalah:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Tampaknya, itu (4024) masih bertahan. Namun, segera setelah saya menghentikan proses induk yang disebut pernyataan "bunuh" di atas, 4024 tidak muncul lagi. Sekarang saya menilai proses "mati" tidak lebih dari garis yang ditampilkan dan memutuskan untuk mengabaikannya. Saya harap pengalaman saya dapat membantu seseorang di luar sana. Tepuk tangan!


0

Anda juga dapat menggunakan kill -luntuk menampilkan sinyal yang didukung oleh arsitektur Anda, dan mempelajari lebih lanjut tentang sinyal yang mungkin ingin Anda gunakan untuk mengirim sinyal dengan benar.

Catatan: seperti yang mungkin disebutkan orang lain, penggunaan kill -9 {PID}tidak disarankan kecuali proses zombie-nya. setelah suatu proses menerima SIGKILL akan segera mati tanpa pembersihan atau prosedur lain yang sesuai.


0

Ini adalah apa yang saya gunakan untuk menjalankan localhost pil pada port 80 (Oleh angular cli) Dapatkan menjalankan aplikasi info pada port 80

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

dimana 3348pid dari proses yang berjalan

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.