Прочитав ответ MelBurslan и различные комментарии, я решил попробовать (вдохновленный их предложениями) сделать версию на Lua. Это было сделано в Lua 5.1.5 - я не уверен, будет ли это работать с последней версией Lua.
Общая идея заключается в использовании popen
(открыть трубу) Lua для выполнения top
и последующей обработки полученных данных с помощью регулярного выражения (или pattern, как оно называется в Lua). Совпадающие строки (а это большинство из них) затем рассматриваются на предмет пересечения порогового процента. Если да, то они добавляются в таблицу.
Если таблица не пуста, то вызывается zenity
для вывода сообщения пользователю. Несколько "заморочек", которые я обнаружил во время разработки:
--display=:0.0
, чтобы при запуске под cron
находился экран дисплея. Я упростил проверку на "каждые 15 минут" в кронтабе, вот так:
*/15 * * * * /home/nick/check_cpu_usage.lua
Регулярное выражение захватывает все от top
на случай, если вы захотите сделать другие тесты (например, на использование слишком большого количества памяти).
Я думаю, это будет быстрее, чем запускать множество процессов и подпрограмм. Кажется, это работает нормально. Проверьте, уменьшив порог (например, до 5) и изменив запись в кронтабе на проверку каждые минуты.
check_cpu_usage.lua
#! /usr/local/bin/lua
THRESHOLD = 90 -- percent
-- pipe output of top through a file "f"
f = assert (io.popen ("top -b -n 1 -w 512"))
t = { }
-- check each line
for line in f:lines() do
-- match top output, eg.
-- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
-- 30734 nick 20 0 6233848 3.833g 3.731g S 8.6 12.2 3:11.75 VirtualBox
local pid, user, priority, nice, virt, res, shr,
status, cpu, mem, time, command =
string.match (line,
"^%s*(%d+)%s+(%a+)%s+(%-?%d+)%s+(%-?%d+)" ..
-- pid user priority nice
"%s+([%d.]+[g]?)%s+([%d.]+[g]?)%s+([%d.]+[g]?)%s+([DRSTZ])%s+(%d+%.%d+)%s+(%d+%.%d+)" ..
-- virtual res shr status %cpu %mem
"%s+([0-9:.]+)%s+(.*)$")
-- time command
-- if a match (first few lines won't) check for CPU threshold
if pid then
cpu = tonumber (cpu)
if cpu >= THRESHOLD then
table.insert (t, string.format ("%s (%.1f%%)", command, cpu))
end -- if
end -- if
end -- for loop
f:close()
-- if any over the limit, alert us
if #t > 0 then
os.execute ('zenity --title="CPU usage warning!" --info ' ..
'--text="These processes are using more than ' ..
THRESHOLD .. '% CPU:\n' ..
table.concat (t, ", ") ..
'" --ok-label="OK" ' ..
'--timeout=60 ' .. -- close dialog after one minute in case we aren't around
'--display=:0.0 ' -- ensure visible when running under cron
)
end -- if
Ниже приведены подробные сведения об устранении этой проблемы. Согласно официальной документации
A minimal installation's %packages section which will also configure the firewall
will look similar to the following:
%packages
@Core
authconfig
system-config-firewall-base
в моем случае authconfig
отсутствовал.
Во-вторых, следуйте рекомендациям @GracefulRestart для правильного синтаксиса
Я полагаю, что вы должны передать параметр службы один раз для каждой службы, которую вы добавляете в брандмауэр:
firewall --enabled --service=ssh --service=glusterfs --service=tftp --service=ntp
Я не могу вспомнить, можно ли использовать расширение bash в кикстарте, но это будет выглядеть близко к тому, что у вас было изначально:
firewall --enabled --service={ssh,glusterfs,tftp,ntp}