我詳細的提供了如下相關資訊:
自定義的參數是這麼寫的:
1
<code>userparameter=chatter.pid[*],parameter1=$1;parameter2=$2;</code><code>ps</code> <code>-ef | </code><code>grep</code> <code>$parameter1 | </code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>| </code><code>grep</code> <code>$parameter2 | </code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>| </code><code>awk</code> <code>'{print $2}'</code>
key是這麼寫的:
<code>chatter.pid[chatter,java]</code>
在指令行中執行以下指令沒有錯,能正确傳回資料:
2
3
<code>parameter1=chatter </code>
<code>parameter2=java </code>
<code>ps</code> <code>-ef | </code><code>grep</code> <code>$parameter1 | </code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>| </code><code>grep</code> <code>$parameter2 | </code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>| </code><code>awk</code> <code>'{print $2}'</code>
但在zabbixserver上執行zabbix_get -s 192.168.100.87 -p 10050 -k "chatter.pid[java,chatter]"卻無法擷取資料,zabbix ui(包括latest data)裡面也沒有資料。
鄧工果然專業,幾秒鐘就看出了問題,大緻回答如下:
自定義的參數這麼寫userparameter=chatter.pid[*],parameter1=$1;parameter2=$2;ps -ef | grep $parameter1 | grep -v grep | grep $parameter2 | grep -v grep | awk '{print $2}'會有問題,可以改為userparameter=chatter.pid[*],ps -ef | grep $1 | grep -v grep | grep $2 | grep -v grep | awk '{print $$2}'然後重新開機zabbix agentd。
實際上隻是将awk中的print $2改為print $$2,因為awk正常情況下是不會使用$$2的,我本着疑人不用用人不疑的态度按照鄧工的方法嘗試,果然奏效!随後鄧工告訴我原因,說這個(userparameter中的shell文法)跟平常所提到的shell不太相同,問題就出在awk的兩個$上。
原來,想要在zabbix裡使用shell位置參數,需要使用$$,不能是$,特别是awk中的位置參數,官方原文如下:
to use positional references unaltered, specify double dollar sign - for example, awk '{print $$2}'. in this case $$2 will actually turn into $2 when executing the command.
note that positional references with the $ sign are interpreted by zabbix agent regardless of whether they are enclosed between double (“) or single (') quotes.
是以在使用awk處理資料時就注意一下,如果感覺不爽,可以考慮使用cut -f1這樣的文法來代替awk。
--end--