У вас это в основном правильно, но похоже, что вы пытались прыгнуть вперед, прежде чем проверять правильность работы кусков. Это также может помочь, если вы назвали обработчиков и переменных, что они пытаются сделать. Например, в этом случае кажется, что ваш обработчик контролирует приложение, а затем выходит из этого приложения, когда он сталкивается с низким потреблением ЦП.
Обратите внимание, что я изменил имя процесса на TaskPaper
в примерах, потому что у меня есть это доступное.
quitOnLowCPU("TaskPaper")
on quitOnLowCPU(processToMonitor)
set processCPU to do shell script "/bin/ps -xco %cpu,command | /usr/bin/awk '/" & processToMonitor & "$/ {print $1}'"
display dialog processCPU
end quitOnLowCPU
На данный момент мы знаем две вещи: то, что сценарий оболочки возвращает число, мы хотим, и что это возвращение его в виде строки.
Для надежного сравнения номеров нам необходимо преобразовать их в числовые значения.
quitOnLowCPU("TaskPaper")
on quitOnLowCPU(processToMonitor)
set processCPU to do shell script "/bin/ps -xco %cpu,command | /usr/bin/awk '/" & processToMonitor & "$/ {print $1}'"
--convert the shell script response string to a number
set processCPU to processCPU as number
--compare to the threshold of quitting
if processCPU is less than 2.0 then
tell application processToMonitor to quit
end if
end quitOnLowCPU
Это работает, но он также пытается бросить processToMonitor
даже если processToMonitor
не работает.
quitOnLowCPU("TaskPaper")
on quitOnLowCPU(processToMonitor)
set processCPU to do shell script "/bin/ps -xco %cpu,command | /usr/bin/awk '/" & processToMonitor & "$/ {print $1}'"
if processCPU is "" then
--the process is gone. We're done
return
end if
--convert the shell script response string to a number
set processCPU to processCPU as number
--compare to the threshold of quitting
if processCPU is less than 2.0 then
tell application processToMonitor to quit
end if
end quitOnLowCPU
Теперь мы готовы добавить repeat
вокруг обработчика:
quitOnLowCPU("TaskPaper")
on quitOnLowCPU(processToMonitor)
repeat
set processCPU to do shell script "/bin/ps -xco %cpu,command | /usr/bin/awk '/" & processToMonitor & "$/ {print $1}'"
if processCPU is "" then
--the process is gone. We're done
return
end if
--convert the shell script response string to a number
set processCPU to processCPU as number
--compare to the threshold of quitting
if processCPU is less than 2.0 then
tell application processToMonitor to quit
end if
delay 1
end repeat
end quitOnLowCPU
Я добавил delay
на каждом повторе, потому что бесконечно повторяющиеся сценарии часто могут стать свиньей CPU сами по себе.