SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{print 768762;}')
Shell phân tích cú pháp đó thành những từ này
SLAB="76876(cat" /proc/meminfo | egrep "Slab:" | awk '{print 768762;}')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^..................... ..................^
Trong đó các ký tự "(cat" là một phần của giá trị cho biến môi trường tạm thời SLAB.
Sau đó, trình bao đang cố gọi /proc/meminfo dưới dạng chỉ huy.
Điều đó để lại một dấu ngoặc đơn đóng không ghép nối gây ra lỗi cú pháp awk
Tôi không rõ mục đích của phiến =$$
và (con mèo ...)
Là. Bạn đang cố gắng đặt biến SLAB để giữ một giá trị nối pid và kết quả của mã được đặt trong ngoặc đơn?
Giải pháp của tôi: Tôi sẽ xây dựng nagios -e
lệnh thành từng mảnh:
nagios_cmd=""
cho var trong Slab MemTotal; làm
nagios_cmd+=$(printf '%s="${$}$(awk '\''/%s:/ {print $2}'\'' /proc/meminfo)"; ' $var $var)
xong
nagios_cmd+='awk -v s="$Slab" -v m="$MemTotal" '\''BEGIN {in 100*s/m}'\'
khai báo -p nagios_cmd
kết quả này
khai báo -- nagios_cmd="Slab=\"\${\$}\$(awk '/Slab:/ {print \$2}' /proc/meminfo)\"; MemTotal=\"\${\$}\ $(awk '/MemTotal:/ {print \$2}' /proc/meminfo)\"; awk -v s=\"\$Slab\" -v m=\"\$MemTotal\" 'BEGIN {print 100*s /m}'"
cho bạn thấy lớp vỏ sẽ bảo vệ tất cả các ký tự cần bảo vệ.
Sau đó, bạn gọi kiểm tra nagios như:
/usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "$nagios_cmd" -w '>50' -c '>80' -p "slab_mem"
# .................................................. .........^^^^^^^^^^^^^
Điều đó có thể được viết dưới dạng một lệnh awk mà không cần các biến shell tạm thời:
nagios_cmd='awk -F":" -v pid="$$" '\''
$1 == "Sàn" {s = pid $2}
$1 == "MemTotal" {m = pid $2}
KẾT THÚC {in 100*s/m}
'\'' /proc/meminfo'
Hoặc, để giúp giải quyết vấn đề trích dẫn, một tài liệu ở đây:
nagios_cmd=$(mèo <<'END_CMD'
awk -F":" -v pid="$$" '
$1 == "Sàn" {s = pid $2}
$1 == "MemTotal" {m = pid $2}
KẾT THÚC {in 100*s/m}
' /proc/meminfo
END_CMD
)