Alguns programes empren la modificaci¨® de la seva l¨ªnia de comandes per mostrar la seva activitat actual. Un usuari pot veure l'activitat executant les comandes ps
i top
. PostgreSQL, Sendmail, Áú»¢¶Ä²© s¨®n exemples d'aquests programes.
Veieu un exemple de Linux. Suposeu que ens cal monitorar un cer nombre de processos d'agent Áú»¢¶Ä²©.
La comanda ps
mostra els processos que ens calen
$ 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]
...
La selecci¨® dels processos per nom d'usuari fan aquesta feina:
Mentrestant, reanomenem l'executable zabbix_agentd
a zabbix_agentd_30
i el reengeguem.
ps
ensenya ara:
$ 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]
...
Mentrestant, la selecci¨® dels processos per nom i usuari produeix un resultat incorrecte:
Per qu¨¨ un simple canvi de nom d'executable cap a un nom m¨¦s llarg ens porta a un resultat ben diferent?
L'agent Áú»¢¶Ä²© comen?a verificant el nom dels processos. L'arxiu /proc/<pid>/status
¨¦s obert i la l¨ªnia Name
marcada. En el nostre cas, les l¨ªnies de Name
²õ¨®²Ô:
$ grep Name /proc/{6715,6716,6717,6718,6719,6720}/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
El nom dels processos dins l'arxiu status
es retalla a 15 car¨¤cters.
Un resultat semblant es pot veure amb la comanda ps
:
$ 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
...
Evidentment, proc.num[]
no ¨¦s igual al nostre valor del par¨¤metre name
: zabbix_agentd_30
. Com ha fallat la coincid¨¨ncia del nom de processos de l'arxiu status
, l'agent Áú»¢¶Ä²© passa al fitxer /proc/<pid>/cmdline
.
Com l'agent veu l'arxiu "cmdline" es pot il¡¤lustrar amb l'execuci¨® d'una comanda
$ for i in 6715 6716 6717 6718 6719 6720; do cat /proc/$i/cmdline | awk '{gsub(/\x0/,"<NUL>"); print};'; done
sbin/zabbix_agentd_30<NUL>-c<NUL>/home/zabbix/ZBXNEXT-1078/zabbix_agentd.conf<NUL>
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]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
sbin/zabbix_agentd_30: listener #2 [waiting for connection]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
sbin/zabbix_agentd_30: listener #3 [waiting for connection]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
sbin/zabbix_agentd_30: active checks #1 [idle 1 sec]<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>...
Els arxius /proc/<pid>/cmdline
del nostre cas contenen octets nuls invisibles i no imprimibles, emprats per acabar les cadenes en llenguatge C. Els octets nuls es representen amb "<NUL>" en aquest exemple.
L'agent Áú»¢¶Ä²© verifica a la "cmdline" el proc¨¦s principal i pren zabbix_agentd_30
, que corresp¨®n al valor del par¨¤metre name
: zabbix_agentd_30
. Aix¨ª, el proc¨¦s principal es compta per l'element 'proc.num[zabbix_agentd_30,zabbix]
.
Quan es verifica el seg¨¹ent proc¨¦s, l'agent pren zabbix_agentd_30: col¡¤lector [idle 1 sec]
dins l'arxiu cmdline
i no correspon pas al nostre par¨¤metre name
zabbix_agentd_30
. Aix¨ª, sobre el proc¨¦s principal que no modifica pas la l¨ªnia de comandes, es compta. Altres processos d'agent modifiquen la seva l¨ªnia de comandes i s'ignoren.
Aquest exemple mostra que el par¨¤metre name
no pot pas ¨¦sser emprat a proc.mem[]
i proc.num[]
per la selecci¨® de processos en aquest cas.
Per a l'element proc.get[]
, quan l'agent Áú»¢¶Ä²© comprova "cmdline" per al nom del proc¨¦s, nom¨¦s emprar¨¤ una part del nom comen?ant des de la darrera barra i fins al primer espai o signe de dos punts. El nom del proc¨¦s rebut del fitxer cmdline nom¨¦s s'emprar¨¤ si el seu inici coincideix completament amb el nom del proc¨¦s escur?at del fitxer "estat". L'algorisme ¨¦s el mateix tant per al nom del proc¨¦s al filtre com per a la sortida JSON.
L'¨²s del par¨¤metre cmdline
amb una expressi¨® regular apropiada produeix un resultat correcte:
Sigueu prudent emprant els elements proc.mem[]
i proc.num[]
per monitorar els programes que modifiquen le seves l¨ªnies de comandes.
Abans de posar els par¨¤metres name
i cmdline
dins els elements proc.mem[]
i proc.num[]
, podeu provar els par¨¤metres amb l'ajuda de l'element proc.num[]
i de la comanda ps
.
cmdline
dins els elements proc.get[]
, proc.mem[]
i proc.num[]
Preneu com a exemple un dels fils del kernel:
Es pot triar amb el par¨¤metre name
dels processos:
Per¨° amb la selecci¨® per processos, el par¨¤metre cmdline no funciona pas:
La ra¨® en que l'agent Áú»¢¶Ä²© pren l'expressi¨® regular especificada al par¨¤metre cmdline
i l'aplica al contenidor de processos /proc/<pid>/cmdline
. Per als fils de kernel, els fitxers /proc/<pid>/cmdline
s¨®n buits. Aix¨ª, el par¨¤metre cmdline
no coincidir¨¤ mai.
proc.mem[]
i proc.num[]
Els fils de kernel Linux es compten amb l'element proc.num[]
, per¨° no assenyalen pas la mem¨°ria de l'element proc.mem[]
. Per exemple:
$ 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.
Per¨° qu¨¨ passa si un proc¨¦s d'usuari porta el mateix nom que un fil de kernel? S'assemblar¨¤ a aix¨°:
$ 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[]
compta tant els fils de kernel com els processos d'usuari. proc.mem[]
reporta la mem¨°ria nom¨¦s per als processos d'usuaris i compta la mem¨°ria del fil de kernel com si tingu¨¦s estat 0. Aquesta ¨¦s diferent del cas que hi ha aqu¨ª dalt, quan ZBX_NOTSUPPORTED ha estat reportat.
Mireu d'¨¦sser prudents quan empreu els elements proc.mem[]
i proc.num[]
si el nom del programa correspon a un dels fils.
Abans d'afegir els par¨¤metres als elements proc.mem[]
i proc.num[]
, podeu testar amb l'ajuda de l'element proc.num[]
i la comanda ps
.