Bagaimana Anda membunuh pohon proses di linux? [Tutup]

14

Terkadang, mengirimkan SIGTERM ke suatu proses akan menyebabkannya mengirim SIGTERM ke semua proses anaknya. Namun, terkadang ini tidak berhasil.

Apakah ada perintah atau utilitas yang akan memungkinkan saya untuk membunuh suatu proses dan semua proses anaknya pada saat yang sama? Saya biasanya menggunakan secara manual mengumpulkan semua pids menjadi satu perintah kill, tapi rasanya bodoh.

Pertanyaan SO ini menanyakan bagaimana melakukan ini dengan perl, tetapi apa pun yang menyelesaikan pekerjaan akan menjadi hebat.

itsadok
sumber
Sepertinya pkill -9lebih kuat daripada pkill, untuk alasan apa pun.
Andrew

Jawaban:

13

Dengan asumsi bahwa proses berbagi pengenal sesi (yang seharusnya mereka lakukan kecuali jika mereka secara eksplisit disebut setsid (), Anda dapat membunuh mereka dengan sesi menggunakan pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

Jika dari terminal lain saya lakukan:

pkill -9 -s 12804

Kemudian semuanya mati dalam satu gerakan.

Anda juga dapat membunuh dengan proses kelompok, meskipun ini cenderung lebih bermanfaat bagi banyak anak yang semuanya satu tingkat di bawah orang tua, bukan rantai proses terkait.

James F
sumber
2

Biasanya, klien yang merespons harus menerima sigterm dan mematikannya sendiri, sehingga menghentikan semua proses anak yang bercabang dua. Jika, di sisi lain, klien tidak merespons, sinyal terminasi normal mungkin tidak akan membangkitkan respons.

Jadi Anda kemudian melanjutkan untuk mengirim SIGKILL, yang memberitahu sistem itu sendiri untuk Membuat Proses Berhenti, Sekarang - yang dapat dilakukan sebagian besar kali, kecuali ketika prosesnya dalam keadaan tidur yang tidak dapat terputus, seperti menunggu beberapa I / O masukan atau serupa.

Dalam hal ini, bahkan SIGKILL pada akhirnya tidak akan melakukan apa pun pada prosesnya; proses anak mungkin akan mengalami keterbelakangan serupa.

Ada kasus perbatasan di mana proses induk mungkin berakhir dengan baik, tetapi proses anak tidak dapat dibunuh. Maka Anda akan berakhir dengan proses zombie yang tidak bisa dibersihkan karena ayahnya sudah tiada, tetapi tidak menanggapi apa pun. Satu-satunya cara untuk menghilangkannya adalah reboot; dalam banyak kasus, mereka tidak berbahaya, karena satu-satunya hal yang mereka lakukan adalah mengambil PID sementara soket apa pun yang mereka coba gunakan sudah layu.

towo
sumber
2

Jika saya ingin mematikan pohon proses Firefox, apakah mungkin membunuhnya dengan perintah di atas "pkill -9 -s firefox"


sumber