Saya telah membuat skrip yang membunuh proses jika penggunaan CPU dan / atau memori mencapai 80%. Itu membuat daftar proses yang terbunuh ketika ini terjadi. Apa yang bisa saya lakukan untuk memperbaikinya?
while [ 1 ];
do
echo
echo checking for run-away process ...
CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_USAGE_THRESHOLD=800
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)
if [ $CPU_USAGE -gt $CPU_USAGE_THRESHOLD] ; then
kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
kill -9 $TOPPROCESS
echo system overloading!
echo Top-most process killed $TOPPROCESS
echo CPU USAGE is at $CPU_LOAD
else
fi
exit 0
sleep 1;
done
while [ 1 ]
membuat saya bertanya-tanya berapa banyak CPU script ini akan mengkonsumsi. Juga, 3 panggilan kekill -9
dalam skrip berjalan terus? Ini membuatku merinding ...sleep 1
di loopJawaban:
Saya menebak masalah yang ingin Anda pecahkan adalah bahwa Anda memiliki beberapa proses yang berjalan di komputer anda yang kadang-kadang bertingkah, dan duduk selamanya mengelompokkan inti.
Hal pertama yang ingin Anda lakukan adalah mencoba memperbaiki program yang menjadi gila. Sejauh ini solusi terbaik. Saya akan berasumsi itu tidak mungkin, atau Anda perlu kluge cepat untuk menjaga kotak Anda berjalan sampai diperbaiki.
Anda, setidaknya, ingin membatasi skrip Anda hanya untuk menekan satu program yang Anda khawatirkan. Akan lebih baik jika izin membatasi skrip Anda seperti ini (mis. Skrip Anda berjalan sebagai pengguna X, satu-satunya hal lain yang berjalan sebagai X adalah programnya).
Bahkan lebih baik menggunakan sesuatu seperti
ulimit -t
membatasi jumlah total waktu CPU yang dapat digunakan oleh program. Demikian pula, jika menghabiskan semua memori, periksaulimit -v
. Kernel memberlakukan batasan ini; lihat halamanbash
manual (ini adalah built-in shell) dan halamansetrlimit(2)
manual untuk detailnya.Jika masalahnya bukan proses yang berjalan mengamuk, tetapi justru terlalu banyak proses yang berjalan, maka terapkan beberapa bentuk penguncian untuk mencegah lebih dari X dari menjalankan (atau — ini seharusnya menjadi akrab—
ulimit -u
). Anda juga dapat mempertimbangkan untuk mengubah prioritas penjadwal proses-proses tersebut (menggunakannice
ataurenice
), atau bahkan lebih drastis, menggunakansched_setscheduler
untuk mengubah kebijakanSCHED_IDLE
.Jika Anda membutuhkan lebih banyak kontrol, lihat grup kontrol (cgroups). Bergantung pada kernel yang Anda jalankan, Anda sebenarnya dapat membatasi jumlah waktu CPU, memori, I / O, dll. Yang dikonsumsi oleh seluruh kelompok proses secara bersamaan. Kelompok kontrol cukup fleksibel; mereka mungkin dapat melakukan apa pun yang Anda coba lakukan, tanpa klasp yang rapuh. Arch Linux Wiki memiliki pengantar untuk cgroup yang layak dibaca, seperti halnya seri cgroup Neil Brown di LWN.
sumber
Masalah:
-n
opsi:sort -nrk 2
. Kalau tidak, garis dengan%CPU
nilai 5.0 akan berakhir lebih tinggi dari satu dengan nilai 12.0.ps
implementasi Anda, Anda mungkin ingin menggunakan--no-headers
opsi untuk menyingkirkangrep -v
. Itu mencegah Anda membuang perintah yang berisiPID
.echo CPU USAGE is at $CPU_LOAD
, maksud Andaecho CPU USAGE is at $CPU_USAGE
.exit 0
yang Anda masukkan saat debugging (?).Gaya:
CPU_USAGE_THRESHOLD=800
baris ke awal file, karena ini hal yang paling informatif dan kemungkinan besar akan berubah bahkan setelah skrip Anda stabil.-e
opsi:ps -eo pid -eo pcpu -eo command
sama sepertips -eo pid -o pcpu -o command
(apa adanyaps -eo pid,pcpu,command
).else
klausa kosong . Itu selalu terlihat seolah-olah harus ditangani, tetapi bukan karena alasan yang tidak diketahui.sumber
Mematikan proses yang menggunakan sebagian besar CPU / memori meminta masalah: Lihat saja apa yang ada sekarang di mesin Anda (di sini saat ini firefox, systemd (init), Xorg, gnome-terminal, satu set thread kernel, xemacs; tidak ada yang bisa dibuang). Lihatlah cara men-tweak OOM-killer Linux, misalnya di sini .
Juga perhatikan bahwa "memori yang digunakan oleh proses" adalah konsep samar-samar, karena ada perpustakaan bersama, executable dibagi, dan bahkan bagian dari area data. Satu dapat datang dengan beberapa nomor dengan mengisi setiap pengguna dengan sebagian kecil dari ruang yang digunakan, tetapi bahkan menambahkan bahwa hingga benar-benar tidak memberikan "memori yang digunakan" (bahkan lebih sedikit "memori yang dibebaskan jika prosesnya hilang", bagian yang dibagikan tetap dibelakang).
sumber
Saya telah membuat skrip, proses kill , yang membunuh beberapa proses yang terdaftar dalam array, jika penggunaan CPU lebih besar dari XX% untuk YY detik atau membunuh proses yang berjalan lebih dari ZZ detik.
CATATAN: Ini repo saya di Github: https://github.com/padosoft/kill-process
Berikut screenshotnya:
Referensi
Bagian penting dari skrip (abstrak kode untuk perintah teratas):
Pemakaian:sumber
sort
seharusnya begitusort -k9nr
. Tanpan
, akan mendapatkan `5.9`>29.4
.