07.06.2016 | 21:28
Teško da je AppleScript sretno rješenje za ovaj slučaj jer idle loop u njemu troši ~10% procesora, a dok obavi sve što treba za riješiti aktualni problem skočit će i preko 100% (ako postoji više od jednog procesora). U tom smislu podržavam prijedlog hardverskog rješenja - za softverski bi bila primjerenija "čista" terminalska skripta koja se aktivira u željenim razmacima ili neki alat poput
monita.
Potencijalni AppleScript mazohisti, na tragu kojim je Smayoo krenuo, mogu iskoristiti ovo u nastavku:
repeat
set check_interval to 5
set cpu_limit to 300
set ps_out to paragraphs of (do shell script "ps x -o pid,%cpu | sort -nrk 2")
repeat with next_line in ps_out
set PID to first word of next_line as integer
set CPU to second word of next_line as real
if CPU > cpu_limit then do shell script "kill -9 " & PID
if CPU = 0 then exit repeat
end repeat
delay check_interval
end repeat
Objašnjenje koda: u beskonačnoj petlji postavlja se željeni interval za provjeru (5 sekundi u primjeru) i limit nakon kojega se gasi proces (300% iskorištenosti procesora u primjeru). Upozoravam da ako se postavi na 100%, velika je vjerojatnoća da će skripta ugasiti samu sebe.
Kriptična linija koja poziva shell komandu oslanja se na "ps" naredbu iz koje čupa PID i %CPU podatak (CPU podatak, bez znaka postotka, bi većinu vremena vraćao nulu!) te ih sortira po %CPU, silazno tako da se u nastavku pokrati testiranje procesa. Petlja koja obrađuje liniju po liniju (koje vraća ps) konvertira PID i CPU u brojeve (jer dolaze kao stringovi), a potom ih testira - ako je CPU vrijednost (koja je zapravo %CPU vrijednost) veća od upisanog limita (300 u primjeru), poziva shell komandu koja gasi taj proces. Drugi if je optimizacija i služi za prekid petlje čim naiđe na prvu nultu vrijednost i zapravo se može optimizirati i pametnije, tako da se prekine testiranje čim je CPU < cpu_limita (jer dalje nema potrebe testirati). Delay pauzira zadani broj sekundi (5). I onda sve iznova, uključno s nepotrebnim trošenjem procesora na AppleScript.
Izbacio sam try blokove (koji bi omogućili izvršavanje skripte i u slučaju greške), ali za "ozbiljno" (što je u ovom slučaju oksimoron) korištenje trebalo bi ih vratiti jer skripta, primjerice, može puknuti ako neki proces koji nije u vlasništvu korisnika prijeđe CPU limit - njega bi trebalo gasiti sa "sudo" komandom (što bi usputno bio i security breach), a to bi pak moglo rezultirati ubijanjem nekog procesa koji ne bi smio biti ubijen (jer pripada sistemu, primjerice). Try blok je u tom scenariju dobra pomoć jer skripta u ovom obliku ne bi mogla pogasiti taj proces, ali ne bi ni puknula - tako da ga se u teoriji može dodati, a u praksi skriptu treba izignorirati jer je zla.