Puncte:0

Eroare în apropierea simbolului neașteptat „(”, dar apoi permisiunea a fost refuzată

drapel in

Încerc să rulez acest plugin 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"

Arată această eroare:

sh: -c: linia 0: eroare de sintaxă lângă simbolul neașteptat `('
sh: -c: linia 0: `SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{print 768762;}'); MEMTOTAL=76876(cat /proc/meminfo | egrep "MemTotal:" | awk '{print ;}'); awk BEGIN 1>/var/tmp/check_generic/check_generic_stdout_77319.64001 2>/var/tmp/check_generic/check_generic_stderr_77319.23364'
slab_mem NECUNOSCUT - rezultat:RC1 output: match:RC!=OK |slab_mem=;50.000000;80.000000;;

Am găsit că evadând ( și ) ar putea să funcționeze, dar nu, atunci dă această eroare:

-bash-4.1$ /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: /proc/meminfo: Permisiune refuzată
awk: {print 749962;})
awk: ^ eroare de sintaxă
sh: /proc/meminfo: Permisiune refuzată
awk: {tipărește ;})
awk: ^ eroare de sintaxă

Singura informație pe care am găsit-o în timp ce încercam să citesc /proc/meminfo este pentru că unii oameni au încercat să o execute (în loc să citească cu pisică) dar nu este cazul.

EDITAȚI | ×: Încercând să scape $$: Comanda:

-bash-4.1$ /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"

Rezultat:

sh: /proc/meminfo: Permisiune refuzată
awk: {tipărește ;})
awk: ^ eroare de sintaxă
awk: (print 499542)
awk: ^ eroare de sintaxă
awk: cmd. linia:1: (tipărit 499542)
awk: cmd.line:1: ^ linie nouă neașteptată sau sfârșit de șir
slab_mem NECUNOSCUT - rezultat:RC1 output: match:RC!=OK [awk: cmd. line:1: blocurile BEGIN trebuie să aibă o parte de acțiune]|slab_mem=;50.000000;80.000000;;
Bodo avatar
drapel pt
Presupunând că doriți să transmiteți un `$` literal unui alt shell și doriți să preveniți extinderea de către shell-ul local, aveți nevoie de `\$` în loc de `$$`. `$$` este PID-ul scriptului curent. Vedeți https://unix.stackexchange.com/q/291570/330217
drapel cn
`SLAB=76876(cat /proc/meminfo | ...` -- Nu sunt sigur ce încercați să faceți acolo. Puteți explica acest fragment anume? Am o presupunere, dar aș dori să faceți explica inainte sa raspund.
pLumo avatar
drapel in
Bănuiesc că ar trebui să fie `SLAB=76876$(cat ...)`. Îți lipsește un `$`.
aldegalan avatar
drapel in
@Bodo Dar \$ nu funcționează cu agentul de la distanță Nagios... trebuie să fie $$
Bodo avatar
drapel pt
@aldegalan Atunci s-ar putea să aveți nevoie de `\$\$`.
aldegalan avatar
drapel in
@Bodo ok, dar încă primim permisiunea refuzată awk: `{print 499542;}) awk: ^ eroare de sintaxă sh: /proc/meminfo: Permisiune refuzată awk: {tipărește ;}) awk: ^ eroare de sintaxă`
Bodo avatar
drapel pt
@aldegalan După cum puteți vedea în `{print 499542;})`, aveți aceeași problemă de citare în comanda AWK. În `$$2`, `$$` este înlocuit cu PID-ul scriptului de shell-ul local urmat de un literal `2`.(Nu cunosc nagios sau pluginul check_generic, deci nu știu dacă acest lucru necesită ghilimele suplimentare sau duplicarea caracterelor `$`.) Eroarea `Permission denied` ar putea fi rezultatul altor moduri de citare greșită. Vă rugăm să [editați] întrebarea dvs. și adăugați toate versiunile modificate ale scriptului/comenzii dvs. cu mesajele de eroare rezultate. Folosiți copy&paste în loc să tastați din nou pentru a evita introducerea de erori fără legătură.
aldegalan avatar
drapel in
@Bodo Gata, mi-am editat întrebarea
Bodo avatar
drapel pt
@aldegalan Se pare că există o problemă cu ghilimele. Dacă am înțeles corect, încercați să utilizați ghilimele duble în interiorul ghilimelelor duble. Puteți adăuga link-uri către o documentație care explică argumentele lui `-e` și citatul necesar? Nu am găsit niciun link de lucru pentru pluginul `check_generic`. Puteți explica ce ar trebui să facă lista de comenzi `SLAB=...`, inclusiv toate comenzile `awk`? Sau de unde vine această listă de comenzi? Vă rugăm să [editați] întrebarea dvs. pentru a furniza aceste informații.
Bodo avatar
drapel pt
Ar ajuta să afișați lista de comenzi așa cum ați rula-o direct într-un shell fără a utiliza nagios și câteva exemple de intrare (= ieșirea lui `cat /proc/meminfo`) și ieșirea corespunzătoare. Înțeleg corect că doriți să extrageți două numere din `/proc/meminfo` și să calculați Slab/MemTotal în %? Acest lucru ar putea fi implementat cu o singură comandă `awk`. Informațiile despre ceea ce doriți să realizați ar face parte din întrebare. (Întrebarea ta pare să fie despre programarea shell și nu are legătură în mod specific cu Ubuntu, așa că s-ar putea să se potrivească mai bine pe stackoverflow.com.)
Puncte:0
drapel cn
SLAB=76876(cat /proc/meminfo | egrep „Slab:” | awk „{print 768762;}”)

coaja analizează asta în aceste cuvinte

SLAB="76876(cat" /proc/meminfo | egrep "Slab:" | awk '{print 768762;}')
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ..................... ..............^

Unde caracterele „(pisica” fac parte din valoarea variabilei de mediu temporare SLAB.

Apoi, shell-ul încearcă să apeleze /proc/meminfo ca a comanda.

Asta lasă o paranteză de închidere neîmperecheată care provoacă eroarea de sintaxă awk


Nu sunt clar care este scopul SLAB=$$ si (pisică ...) este. Încercați să setați variabila SLAB să dețină o valoare care concatenează pid-ul și rezultatul codului între paranteze?


Soluția mea: aș construi nagios -e comanda pe bucati:

nagios_cmd=""
pentru var în Slab MemTotal; do
    nagios_cmd+=$(printf '%s="${$}$(awk '\''/%s:/ {print $2}'\'' /proc/meminfo)"; ' $var $var)
Terminat

nagios_cmd+='awk -v s="$Slab" -v m="$MemTotal" '\''BEGIN {print 100*s/m}'\'

declara -p nagios_cmd

Aceasta iese

declare -- nagios_cmd="Slab=\"\${\$}\$(awk '/Slab:/ {print \$2}' /proc/meminfo)\"; MemTotal=\"\${\$}\ $(awk '/MemTotal:/ {printare \$2}' /proc/meminfo)\"; awk -v s=\"\$Slab\" -v m=\"\$MemTotal\" 'ÎNCEPE {printare 100*s /m}'"

care vă arată că coaja va proteja toate personajele care au nevoie de protecție.

Apoi invocați verificarea nagios ca:

/usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "$nagios_cmd" -w '>50' -c '>80' -p "slab_mem"
# ................................................. .........^^^^^^^^^^^^^^

Aceasta poate fi scrisă ca o singură comandă awk fără a fi nevoie de variabilele shell temporare:

nagios_cmd='awk -F":" -v pid="$$" '\''
    $1 == „Placă” {s = pid $2}
    $1 == „MemTotal” {m = pid $2}
    END {print 100*s/m}
'\'' /proc/meminfo'

Sau, pentru a ajuta cu iadul citat, un document aici:

nagios_cmd=$(cat <<'END_CMD'
    awk -F":" -v pid="$$" '
        $1 == „Placă” {s = pid $2}
        $1 == „MemTotal” {m = pid $2}
        END {print 100*s/m}
    ' /proc/meminfo
END_CMD
)
aldegalan avatar
drapel in
Deci cum as putea sa o rezolv? Și da, încerc să cocnatenez pid-ul și rezultatul

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.