9 Notes on selecting processes in proc.mem and proc.num items
Some programs use modifying their commandline as a method for displaying their current activity. A user can see the activity by running ps and top commands. Examples of such programs include PostgreSQL, Sendmail, Zabbix.
Let’s see an example from Linux. Let’s assume we want to monitor a number of Zabbix agent processes.
ps command shows processes of interest as
$ ps -fu zabbix UID PID PPID C STIME TTY TIME CMD . zabbix 6318 1 0 12:01 ? 00:00:00 sbin/zabbix_agentd -c /home/zabbix/ZBXNEXT-1078/zabbix_agentd.conf zabbix 6319 6318 0 12:01 ? 00:00:01 sbin/zabbix_agentd: collector [idle 1 sec] zabbix 6320 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: listener #1 [waiting for connection] zabbix 6321 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: listener #2 [waiting for connection] zabbix 6322 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: listener #3 [waiting for connection] zabbix 6323 6318 0 12:01 ? 00:00:00 sbin/zabbix_agentd: active checks #1 [idle 1 sec] .
Selecting processes by name and user does the job:
$ zabbix_get -s localhost -k 'proc.num[zabbix_agentd,zabbix]' 6
Now let’s rename zabbix_agentd executable to zabbix_agentd_30 and restart it.
$ ps -fu zabbix UID PID PPID C STIME TTY TIME CMD . zabbix 6715 1 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30 -c /home/zabbix/ZBXNEXT-1078/zabbix_agentd.conf zabbix 6716 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: collector [idle 1 sec] zabbix 6717 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: listener #1 [waiting for connection] zabbix 6718 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: listener #2 [waiting for connection] zabbix 6719 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: listener #3 [waiting for connection] zabbix 6720 6715 0 12:53 ? 00:00:00 sbin/zabbix_agentd_30: active checks #1 [idle 1 sec] .
Now selecting processes by name and user produces an incorrect result:
$ zabbix_get -s localhost -k 'proc.num[zabbix_agentd_30,zabbix]' 1
Why a simple renaming of executable to a longer name lead to quite different result ?
Zabbix agent starts with checking the process name. /proc//status file is opened and the line Name is checked. In our case the Name lines are:
$ grep Name /proc/ /status /proc/6715/status:Name: zabbix_agentd_3 /proc/6716/status:Name: zabbix_agentd_3 /proc/6717/status:Name: zabbix_agentd_3 /proc/6718/status:Name: zabbix_agentd_3 /proc/6719/status:Name: zabbix_agentd_3 /proc/6720/status:Name: zabbix_agentd_3
The process name in status file is truncated to 15 characters.
A similar result can be seen with ps command:
$ ps -u zabbix PID TTY TIME CMD . 6715 ? 00:00:00 zabbix_agentd_3 6716 ? 00:00:01 zabbix_agentd_3 6717 ? 00:00:00 zabbix_agentd_3 6718 ? 00:00:00 zabbix_agentd_3 6719 ? 00:00:00 zabbix_agentd_3 6720 ? 00:00:00 zabbix_agentd_3 .
Obviously, that is not equal to our proc.num[] name parameter value zabbix_agentd_30 . Having failed to match the process name from status file the Zabbix agent turns to /proc//cmdline file.
How the agent sees the «cmdline» file can be illustrated with running a command
$ for i in 6715 6716 6717 6718 6719 6720; do cat /proc/$i/cmdline | awk ';' ; done sbin/zabbix_agentd_30NUL>-cNUL>/home/zabbix/ZBXNEXT-1078/zabbix_agentd.confNUL> sbin/zabbix_agentd_30: collector [idle 1 sec]NUL>NUL>NUL>NUL>NUL>NUL>NUL>NUL>NUL>NUL>NUL>NUL>NUL>. sbin/zabbix_agentd_30: listener #1 [waiting for connection]. sbin/zabbix_agentd_30: listener #2 [waiting for connection]. sbin/zabbix_agentd_30: listener #3 [waiting for connection]. sbin/zabbix_agentd_30: active checks #1 [idle 1 sec].
/proc//cmdline files in our case contain invisible, non-printable null bytes, used to terminate strings in C language. The null bytes are shown as «» in this example.
Zabbix agent checks «cmdline» for the main process and takes a zabbix_agentd_30 , which matches our name parameter value zabbix_agentd_30 . So, the main process is counted by item proc.num[zabbix_agentd_30,zabbix] .
When checking the next process, the agent takes zabbix_agentd_30: collector [idle 1 sec] from the cmdline file and it does not meet our name parameter zabbix_agentd_30 . So, only the main process which does not modify its commandline, gets counted. Other agent processes modify their command line and are ignored.
This example shows that the name parameter cannot be used in proc.mem[] and proc.num[] for selecting processes in this case.
For proc.get[] item, when Zabbix agent checks «cmdline» for the process name, it will only use part of the name starting from the last slash and until the first space or colon sign. Process name received from cmdline file will only be used if its beginning completely matches the shortened process name in the status file. The algorithm is the same for both process name in the filter and in the JSON output.
Using cmdline parameter with a proper regular expression produces a correct result:
$ zabbix_get -s localhost -k 'proc.num[,zabbix,,zabbix_agentd_30[ :]]' 6
Be careful when using proc.get[] , proc.mem[] and proc.num[] items for monitoring programs which modify their command lines.
Before putting name and cmdline parameters into proc.get[] , proc.mem[] and proc.num[] items, you may want to test the parameters using proc.num[] item and ps command.
Linux kernel threads
Threads cannot be selected with cmdline parameter in proc.get[] , proc.mem[] and proc.num[] items
Let’s take as an example one of kernel threads:
$ ps -ef| grep kthreadd root 2 0 0 09:33 ? 00:00:00 [kthreadd]
It can be selected with process name parameter:
$ zabbix_get -s localhost -k 'proc.num[kthreadd,root]' 1
But selection by process cmdline parameter does not work:
$ zabbix_get -s localhost -k 'proc.num[,root,,kthreadd]' 0
The reason is that Zabbix agent takes the regular expression specified in cmdline parameter and applies it to contents of process /proc//cmdline . For kernel threads their /proc//cmdline files are empty. So, cmdline parameter never matches.
Counting of threads in proc.mem[] and proc.num[] items
Linux kernel threads are counted by proc.num[] item but do not report memory in proc.mem[] item. For example:
$ ps -ef | grep kthreadd root 2 0 0 09:51 ? 00:00:00 [kthreadd] $ zabbix_get -s localhost -k 'proc.num[kthreadd]' 1 $ zabbix_get -s localhost -k 'proc.mem[kthreadd]' ZBX_NOTSUPPORTED: Cannot get amount of "VmSize" memory.
But what happens if there is a user process with the same name as a kernel thread ? Then it could look like this:
$ ps -ef | grep kthreadd root 2 0 0 09:51 ? 00:00:00 [kthreadd] zabbix 9611 6133 0 17:58 pts/1 00:00:00 ./kthreadd $ zabbix_get -s localhost -k 'proc.num[kthreadd]' 2 $ zabbix_get -s localhost -k 'proc.mem[kthreadd]' 4157440
proc.num[] counted both the kernel thread and the user process. proc.mem[] reports memory for the user process only and counts the kernel thread memory as if it was 0. This is different from the case above when ZBX_NOTSUPPORTED was reported.
Be careful when using proc.mem[] and proc.num[] items if the program name happens to match one of the thread.
Before putting parameters into proc.mem[] and proc.num[] items, you may want to test the parameters using proc.num[] item and ps command.
ZABBIX — Настраиваем мониторинг служб
Всем привет, часто возникает необходимость настроить мониторинг различные службы и всегда знать если что-то упало. В данной статье расскажу о том как настроить мониторинг служб по средствам Zabbix.
ZABBIX — Настраиваем мониторинг служб.
Создаём элемент данных.
Для начала необходимо выбрать наш шаблон, к которому привязан интересующий нас узел сети, если его нет создаём, о том как создать шаблон можете прочитать тут: ZABBIX — Новый шаблон. В нашем случае шаблон у нас уже есть с привязанным к нему узлом сети. Переходим в «Настройка» -> «Шаблоны» -> Выбираем наш шаблон ->Выбираем «Элементы данных» и нажимаем кнопку «Создать элемент данных»
Zabbix-создаём элементы данных
Дальше необходимо вписать наши условия, оставляем все пункты по умолчанию, кроме «Имя» и «Ключ». Вписываем любое угодное нам имя и в поле ключ нажимаем «Выбрать»
Ищем в списке ключ «proc.num[,,,]», выбираем его.
Вот что про данный ключ пишут в документации Zabbix-а:
proc.num[,,,] | ||||
---|---|---|---|---|
Количество процессов. | Целое число | имя — имя процесса (по умолчанию “все процессы”) пользователь — имя пользователя (по умолчанию “все пользователи”) состояние — возможные значения: all (по умолчанию), run, sleep, zomb cmdline — фильтр по командной строке (является регулярным выражением) | Примеры ключей: ⇒ proc.num[,mysql] — количество процессов выполняемых под пользователем mysql ⇒ proc.num[apache2,www-data] — количество процессов apache2 выполняемых под пользователем www-data ⇒ proc.num[,oracle,sleep,oracleZABBIX] — количество процессов в спящем состоянии выполняемых под oracle и имеющих oracleZABBIX в содержимом командной строкиСмотрите заметки по выбору процессов с параметрами имя и cmdline (специфика для Linux).В Windows, поддерживаются только параметры имя и пользователь. |
Затем нам необходимо указать необходимые параметры для ключа. К примеру мы хотим настроить мониторинг демона под названием «sendsms», тогда ключ у нас будет таким:
#Автоматизация #Технологии #Процессы #ИТ #Записки #Журнал #Блог #Форум
Но бывает такое что процесс у нас не отображается или запущен как одно имя, а команда перезапуска под другим или имеются зависимости.
Один из примеров
Если не видит процесс proc.num[rstpass]
zabbix_get -s IP -k ‘proc.num[rstpass]’
Ответ 0
Но видно что запущенно
# service rstpass status
? rstpass.service
Loaded: loaded (/lib/systemd/system/rstpass.service; enabled)
Active: active (running) since Fri 2020-10-02 13:24:28 MSK; 3 days ago
Main PID: 8441 (bash)
CGroup: /system.slice/rstpass.service
+- 8441 /bin/bash /usr/share/rst/rstpass.sh
L-22507 /usr/bin/php -f /usr/share/rst/pass.php
Oct 02 13:24:28 monitor systemd[1]: Started rstpass.service
Проверка командами смотрим есть ли такой процесс
ps -A
ps -ef
ps -u
ps -fu
ps -ux
ps -e
service —status-all
ps -fu root или ps -u root — Список процессов запущенных от root
пример для заббикс агента
proc.num[zabbix_agentd,root]
Количество процессов. Целое число
имя — имя процесса (по умолчанию “все процессы”)
пользователь — имя пользователя (по умолчанию “все пользователи”)
состояние — возможные значения:
all (по умолчанию),
disk — непрерывный сон,
run — в процессе работы,
sleep — прерываемый сон,
trace — остановлен,
zomb — зомби
cmdline — фильтр по командной строке (является регулярным выражением)
зона — целевая зона: current (по умолчанию), all. Этот параметр поддерживается только на Solaris платформе.
Имя процесса в файле status обрезается до 15 символов
проверка ps -u имя процесса
Будучи не в состоянии найти совпадение имени процесса в файле status Zabbix агент обращается к файлу /proc//cmdline
Использование параметра cmdline с надлежащим регулярным выражением даст правильный результат
Будьте осторожны в использовании элементов данных proc.mem[] и proc.num[] при наблюдении за программами, которые модифицируют свои командные строки
Делаем так
zabbix_get -s IP -k ‘proc.num[. rstpass]’
Ответ 1
Если разные имя есть у нас сервис с одним какими то именем например jestx , а процесса или самой работы службы мы не видим работает под другим именем например jes можно посмотреть в автозагрузочном файле данной службы пример пути /etc/rc.d/rc0.d находим нужный файл и смотрим по синтаксису что он запускает какие процессы файлы с каким именем и проверяем есть ли такие запущенные у нас при работе данной службе , а при остановке пропали ли они. Если да ставим их на мониторинг а в тегах триггера прописываем нормальное название сервиса для его перезапуска!
Пример tomcat служба называется tomcat3 а проверяем tomcat
Поиск запущенных Томкат
ps auxwww | grep /opt/open510 | grep ‘java’ | grep ‘tomcat’ | grep -v ‘grep’
Найти ИД процесса
ps auxwww | grep /opt/open510 | grep ‘java’ | grep ‘tomcat’ | grep -v ‘grep’ | awk ‘< print $2>‘
/etc/init.d/tomcat3 status
service tomcat3 status
proc.num[. tomcat] — получаем ключ
Проверка на Киоске что запущенна Mozilla Firefox и открыта нужная ссылка
proc.num[firefox,kiosk2] — запущенный процесс Мозиллы от пользователя kiosk2
Проверка ссылки процесса
ps -ef|grep -E «firefox -url https://сайт.ru/kiosk/»
proc.num[,,,,]
zabbix_get -s 192.168.ххх.ххх -k ‘proc.num[firefox,kiosk2,all,сайт.ru/kiosk]’