Score:0

เกิดข้อผิดพลาดใกล้โทเค็นที่ไม่คาดคิด `(' แต่การอนุญาตถูกปฏิเสธ

ธง in

ฉันกำลังพยายามเรียกใช้ปลั๊กอิน nagios นี้:

sudo /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=$$(cat /proc/meminfo | egrep "Slab:" | awk '{print $$2;}'); MEMTOTAL =$$(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'); awk "BEGIN {print 100*$$SLAB/$$MEMTOTAL}"" -w '>50' - c '>80' -p "slab_mem"

มันแสดงข้อผิดพลาดนี้:

sh: -c: บรรทัด 0: ข้อผิดพลาดทางไวยากรณ์ใกล้โทเค็นที่ไม่คาดคิด `('
sh: -c: บรรทัด 0: `SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{print 768762;}'); MEMTOTAL=76876(cat /proc/meminfo | egrep "MemTotal:" | awk '{พิมพ์ ;}'); awk BEGIN 1>/var/tmp/check_generic/check_generic_stdout_77319.64001 2>/var/tmp/check_generic/check_generic_stderr_77319.23364'
slab_mem ไม่ทราบ - ผลลัพธ์:RC1 เอาต์พุต: จับคู่:RC!=ตกลง |slab_mem=;50.000000;80.000000;;

ฉันพบว่าการหลบหนี ( และ ) ทำให้มันใช้งานได้ แต่มันไม่ได้ มันให้ข้อผิดพลาดนี้:

-bash-4.1$ /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=$$\(cat /proc/meminfo | egrep "Slab:" | awk '{พิมพ์ $$2; }'\); MEMTOTAL=$$\(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'\); awk "BEGIN {พิมพ์ 100*$$SLAB/$$MEMTOTAL}" " -w '>50' -c '>80' -p "slab_mem"
sh: /proc/meminfo: ปฏิเสธการอนุญาต
awk: {พิมพ์ 749962;})
awk: ^ ข้อผิดพลาดทางไวยากรณ์
sh: /proc/meminfo: ปฏิเสธการอนุญาต
awk: {พิมพ์ ;})
awk: ^ ข้อผิดพลาดทางไวยากรณ์

ข้อมูลเดียวที่ฉันพบขณะพยายามอ่าน /proc/meminfo เป็นเพราะบางคนพยายามดำเนินการ (แทนที่จะอ่านด้วย แมว) แต่นี่ไม่ใช่กรณี

แก้ไข: พยายามหลบหนี $$: สั่งการ:

-bash-4.1$ /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=\$\$\(cat /proc/meminfo | egrep "Slab:" | awk '(พิมพ์ $ $2'\) MEMTOTAL=\$\$\(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'\); awk "BEGIN {พิมพ์ 100*\$\$SLAB/\$ \$MEMTOTAL}"" -w '>50' -c '>80' -p "slab_mem"

ผลลัพธ์:

sh: /proc/meminfo: ปฏิเสธการอนุญาต
awk: {พิมพ์ ;})
awk: ^ ข้อผิดพลาดทางไวยากรณ์
awk: (พิมพ์ 499542)
awk: ^ ข้อผิดพลาดทางไวยากรณ์
awk: cmd บรรทัด:1: (พิมพ์ 499542)
awk: cmdบรรทัด:1: ^ บรรทัดใหม่หรือจุดสิ้นสุดของสตริงที่ไม่คาดคิด
slab_mem UNKNOWN - ผลลัพธ์:RC1 เอาต์พุต: จับคู่:RC!=ตกลง [awk: cmd. บรรทัด:1: บล็อก BEGIN ต้องมีส่วนดำเนินการ]|slab_mem=;50.000000;80.000000;;
Bodo avatar
pt flag
สมมติว่าคุณต้องการส่ง `$` ตามตัวอักษรไปยังเชลล์อื่น ๆ และต้องการป้องกันไม่ให้เชลล์ในเครื่องขยายตัว คุณต้องใช้ `\$` แทน `$$` `$$` คือ PID ของสคริปต์ปัจจุบัน ดู https://unix.stackexchange.com/q/291570/330217
cn flag
`SLAB=76876(cat /proc/meminfo | ...` -- ฉันไม่แน่ใจว่าคุณกำลังพยายามทำอะไรอยู่ คุณช่วยอธิบายตัวอย่างนี้ได้ไหม ฉันพอเดาได้ แต่อยากให้คุณอธิบาย อธิบายก่อนฉันจะตอบ
pLumo avatar
in flag
ฉันเดาว่ามันควรจะเป็น `SLAB=76876$(cat ...)` คุณไม่มี `$`
aldegalan avatar
in flag
@Bodo แต่ \$ ไม่ทำงานกับตัวแทนระยะไกล Nagios ... ต้องเป็น $$
Bodo avatar
pt flag
@aldegalan จากนั้นคุณอาจต้องการ `\$\$`
aldegalan avatar
in flag
@Bodo ตกลง แต่ยังคงได้รับอนุญาตถูกปฏิเสธ awk: `{print 499542;}) awk: ^ ข้อผิดพลาดทางไวยากรณ์ sh: /proc/meminfo: ปฏิเสธการอนุญาต awk: {พิมพ์ ;}) awk: ^ ข้อผิดพลาดทางไวยากรณ์`
Bodo avatar
pt flag
@aldegalan อย่างที่คุณเห็นใน `{print 499542;})` คุณมีปัญหาในการอ้างถึงเหมือนกันในคำสั่ง AWK ใน `$$2` `$$` จะถูกแทนที่ด้วย PID ของสคริปต์ด้วยเชลล์ในเครื่องตามด้วย `2` ตามตัวอักษร(ฉันไม่รู้จัก nagios หรือปลั๊กอิน check_generic ดังนั้นฉันจึงไม่รู้ว่าจำเป็นต้องใส่เครื่องหมายคำพูดเพิ่มเติมหรือใช้อักขระ `$` ซ้ำหรือไม่) ข้อผิดพลาด `อนุญาตถูกปฏิเสธ` อาจเป็นผลจากวิธีอื่นในการอ้างอิงผิด โปรด [แก้ไข] คำถามของคุณและเพิ่มสคริปต์/คำสั่งเวอร์ชันที่แก้ไขทั้งหมดของคุณพร้อมข้อความแสดงข้อผิดพลาดที่เป็นผลลัพธ์ ใช้การคัดลอกและวางแทนการพิมพ์ซ้ำเพื่อหลีกเลี่ยงข้อผิดพลาดที่ไม่เกี่ยวข้อง
aldegalan avatar
in flag
@Bodo เสร็จแล้ว ฉันแก้ไขคำถามของฉัน
Bodo avatar
pt flag
@aldegalan ดูเหมือนจะมีปัญหากับเครื่องหมายคำพูด ถ้าฉันเข้าใจถูกต้อง คุณลองใช้เครื่องหมายอัญประกาศคู่ภายในอัญประกาศคู่ คุณสามารถเพิ่มลิงก์ไปยังเอกสารบางส่วนที่อธิบายข้อโต้แย้งของ `-e` และการอ้างอิงที่จำเป็นได้หรือไม่ ฉันไม่พบลิงก์ที่ใช้งานได้สำหรับปลั๊กอิน `check_generic` คุณช่วยอธิบายได้ไหมว่ารายการคำสั่ง `SLAB=...` รวมถึงคำสั่ง `awk` ทั้งหมดควรทำอย่างไร หรือรายการคำสั่งนี้มาจากไหน? โปรด [แก้ไข] คำถามของคุณเพื่อให้ข้อมูลนี้
Bodo avatar
pt flag
มันจะช่วยในการแสดงรายการคำสั่งในขณะที่คุณเรียกใช้โดยตรงในเชลล์โดยไม่ต้องใช้ nagios และตัวอย่างอินพุต (= เอาต์พุตของ `cat /proc/meminfo`) และเอาต์พุตที่สอดคล้องกัน ฉันเข้าใจถูกต้องหรือไม่ว่าคุณต้องการแยกตัวเลขสองตัวจาก `/proc/meminfo` และคำนวณ Slab/MemTotal เป็น % สิ่งนี้สามารถนำไปใช้ได้ด้วยคำสั่ง 'awk' คำสั่งเดียว ข้อมูลเกี่ยวกับสิ่งที่คุณต้องการบรรลุจะอยู่ในคำถาม (คำถามของคุณดูเหมือนจะเกี่ยวกับการเขียนโปรแกรมเชลล์และไม่เกี่ยวข้องกับ Ubuntu โดยเฉพาะ ดังนั้นมันอาจจะเหมาะกับ stackoverflow.com มากกว่า)
Score:0
ธง cn
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
)
aldegalan avatar
in flag
แล้วฉันจะแก้ไขมันได้อย่างไร? และใช่ ฉันกำลังพยายามเชื่อมโยง pid กับผลลัพธ์

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา