SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{พิมพ์ 768762;}')
เชลล์จะแยกวิเคราะห์ออกมาเป็นคำเหล่านี้
SLAB="76876(cat" /proc/meminfo | egrep "Slab:" | awk '{พิมพ์ 768762;}')
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^..................... ..................^
โดยที่อักขระ "(cat" เป็นส่วนหนึ่งของค่าสำหรับตัวแปรสภาพแวดล้อมชั่วคราวของ SLAB
จากนั้น เชลล์พยายามเรียก /proc/meminfo เป็น a สั่งการ.
ซึ่งจะทำให้วงเล็บปิดที่ไม่จับคู่ทำให้เกิดข้อผิดพลาดทางไวยากรณ์ awk
ฉันไม่ชัดเจนว่าจุดประสงค์ของ แผ่นพื้น = $$
และ (แมว ...)
เป็น. คุณกำลังพยายามตั้งค่าตัวแปร SLAB ให้เก็บค่าที่เชื่อม pid และผลลัพธ์ของรหัสที่อยู่ในวงเล็บหรือไม่
ทางออกของฉัน: ฉันจะสร้าง nagios -e
คำสั่งเป็นชิ้น ๆ :
nagios_cmd=""
สำหรับ var ใน Slab MemTotal; ทำ
nagios_cmd+=$(printf '%s="${$}$(awk '\''/%s:/ {print $2}'\'' /proc/meminfo)"; ' $var $var)
เสร็จแล้ว
nagios_cmd+='awk -v s="$Slab" -v m="$MemTotal" '\''BEGIN {พิมพ์ 100*s/m}'\'
ประกาศ -p nagios_cmd
ผลลัพธ์นี้
ประกาศ -- nagios_cmd="Slab=\"\${\$}\$(awk '/Slab:/ {print \$2}' /proc/meminfo)\"; MemTotal=\"\${\$}\ $(awk '/MemTotal:/ {print \$2}' /proc/meminfo)\"; awk -v s=\"\$Slab\" -v m=\"\$MemTotal\" 'BEGIN {พิมพ์ 100*s /m}'"
ซึ่งแสดงให้คุณเห็นว่าเชลล์จะปกป้องตัวละครทั้งหมดที่ต้องการการปกป้อง
จากนั้นคุณเรียกใช้การตรวจสอบ nagios เช่น:
/usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "$nagios_cmd" -w '>50' -c '>80' -p "slab_mem"
# ................................................. .........^^^^^^^^^^^^^
ที่สามารถเขียนเป็นคำสั่ง awk เดียวโดยไม่ต้องใช้ตัวแปรเชลล์ชั่วคราว:
nagios_cmd='awk -F":" -v pid="$$" '\''
$1 == "พื้น" {s = pid $2}
$1 == "MemTotal" {m = pid $2}
สิ้นสุด {พิมพ์ 100*s/m}
'\'' /proc/meminfo'
หรือเพื่อช่วยในการอ้างถึงนรก เอกสารที่นี่:
nagios_cmd=$(แมว <<'END_CMD'
awk -F":" -v pid="$$" '
$1 == "พื้น" {s = pid $2}
$1 == "MemTotal" {m = pid $2}
สิ้นสุด {พิมพ์ 100*s/m}
' /proc/meminfo
END_CMD
)