Cuplikan Bash karena membunuh proses hingga mati?

8

Saya mencoba menulis skrip bash yang kuat, dan di dalamnya saya membuat proses latar belakang. Di akhir skrip, saya ingin membunuhnya. Saya memilikinya PID.

Saya sedang memikirkan sesuatu seperti ini

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done

Ada saran untuk sesuatu yang lebih baik? Adakah kemungkinan masalah dengan pendekatan ini?

Rory
sumber
Bukan maksud Anda ps -ef?
user1686
1
grawity: Itu hanya gaya BSD vs opsi UNIX, tetapi ef tampaknya lebih cocok dengan opsi UNIX. Saya akan pergi dengan 'ps ao pid' sendiri
Kyle Brandt
while [[ ps ef $PID ]]adalah kesalahan sintaksis. Saya menganggap Anda maksud while ps ef $PID.
Dennis

Jawaban:

10

Masalah dengan berulang kali membunuh suatu proses adalah bahwa Anda memiliki kondisi balapan dengan pembuatan proses baru. Ini tidak terlalu mungkin, tetapi ada kemungkinan bahwa proses akan keluar dan proses baru memulai dengan PID yang sama saat Anda sedang tidur.

Mengapa Anda harus berulang kali membunuh prosesnya? Jika itu karena proses akan keluar, tetapi mungkin perlu waktu untuk berhenti setelah menerima sinyal, Anda dapat menggunakan wait:

 kill $PID
 wait $PID

Dalam sistem yang ideal, Anda tidak perlu mengulangi killatau mengeluarkan masalah kill -9 $PID. Jika memang harus, Anda mungkin ingin mempertimbangkan untuk memperbaiki apa pun yang sedang Anda jalankan sehingga Anda tidak perlu melakukannya. Sementara itu, Anda mungkin tidak akan mengenai kondisi balapan, dan Anda dapat menjaganya dengan (misalnya) memeriksa cap waktu dari / proc / $ PID / sesaat sebelum mematikan proses. Tapi itu adalah hackiness yang buruk.

Andrew Aylett
sumber
1
Ini tidak berfungsi jika PID bukan milik proses anak, yaitu skrip ini mencoba untuk mengontrol pelaksanaan proses yang berasal dari tempat lain. Saya dapatkan bash: wait: pid 32137 is not a child of this shellketika saya mencoba. :(
Justin Force
9

Untuk semua orang yang merekomendasikan langkah dari kill $PIDke kill -9 $PID, saya harus mengingatkan Anda tentang penggunaan kill -9 yang tidak berguna .

Tidak tidak Tidak. Jangan gunakan kill -9.

Itu tidak memberi proses kesempatan untuk bersih:

  1. matikan koneksi soket

  2. membersihkan file temp

  3. beri tahu anak-anaknya bahwa itu akan hilang

  4. atur ulang karakteristik terminalnya

dan seterusnya dan seterusnya.

Umumnya, kirim 15, dan tunggu satu atau dua detik, dan jika itu tidak berhasil, kirim 2, dan jika itu tidak berhasil, kirim 1. Jika tidak, HAPUS BINARY karena programnya berperilaku buruk!

Jangan gunakan kill -9. Jangan mengeluarkan pemanen gabungan hanya untuk merapikan pot bunga.

Sekarang, saya tidak setuju dengan "menghapus bagian biner", tetapi perkembangannya tampaknya kurang merusak daripada hanya sebuah kill -9.

Saya juga setuju dengan kepedulian tentang kondisi ras pada penciptaan proses baru dengan PID yang sama yang disebutkan di sini .

Adriano Varoli Piazza
sumber
0

Pertama lakukan pembunuhan normal, Tidur x jumlah detik, dan kemudian bunuh -9 jika masih ada. Juga, ini sepertinya situasi aneh yang Anda alami, mungkin ingin menjelaskan kepada kami masalah yang lebih besar.

Kyle Brandt
sumber
Sepakat. Jika tidak merespons dan ditutup setelah satu SIGTERM (sinyal dikirim secara default oleh kill) maka mungkin tidak akan merespons ke 2, 3, 4, ...., sehingga tindakan Anda selanjutnya adalah SIGKILL (kill - 9). Tentu saja Anda harus memastikan bahwa X dalam "sleep X seconds" cukup lama untuk memungkinkan proses melakukan operasi pembersihan-dan-cuti normal yang normal meskipun sistemnya sarat beban - mungkin butuh sebagian kecil dari satu detik biasanya tetapi puluhan detik ketika sistem meronta-ronta.
David Spillett
0

Biasanya Anda ingin mencoba kill $PIDdulu,

lalu biarkan ia tidur sebentar untuk melihat apakah ia akan keluar dengan anggun.

Jika tidak, jalankan kill -9 $PIDuntuk menyingkirkannya dengan paksa.

Brent
sumber
-1

kenapa tidak adil?

kill -9 $PID

chris
sumber
2
Karena Anda ingin memberikan proses kesempatan untuk membersihkan dan mati dengan baik, itulah yang dilakukan oleh sinyal TERM (sinyal default). Sinyal KILL ("-9") tidak memberikan kesempatan pada proses itu.
ktower
Poin bagus, tapi poster aslinya mengatakan dia hanya ingin membunuhnya.
chris