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?
ps -ef
?while [[ ps ef $PID ]]
adalah kesalahan sintaksis. Saya menganggap Anda maksudwhile ps ef $PID
.Jawaban:
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
:Dalam sistem yang ideal, Anda tidak perlu mengulangi
kill
atau mengeluarkan masalahkill -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.sumber
bash: wait: pid 32137 is not a child of this shell
ketika saya mencoba. :(Untuk semua orang yang merekomendasikan langkah dari
kill $PID
kekill -9 $PID
, saya harus mengingatkan Anda tentang penggunaan kill -9 yang tidak berguna .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 .
sumber
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.
sumber
Biasanya Anda ingin mencoba
kill $PID
dulu,lalu biarkan ia tidur sebentar untuk melihat apakah ia akan keluar dengan anggun.
Jika tidak, jalankan
kill -9 $PID
untuk menyingkirkannya dengan paksa.sumber
kenapa tidak adil?
kill -9 $PID
sumber