Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: chipset 18. 06. 2018, 21:03:56
-
Zdravím,
mám zde error v mém scriptu, který má sledovat místo na disku a při 90% tresholdu poslat mail. Jede to na HP-UX
Zde je scrip:
bdf | grep -vE '^/opt/xip/xib/' | awk '{ print $5 " " $1 }' | while read output;
do
echo $output
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge 90 ]; then
echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)
This is system generated e-mail " |
mailx -s "Alert: Almost out of disk space $usep%" email@server.com
fi
done
Při spuštění scriptu mu to vyhodít tento error
syntax error at line 12 : `done' unexpected
Jsem slepej, nebo tam fakt není nikde apostrof navíc?
-
mate preruseny radek uprostred retezce a za pipe
-
jak pise gll, pokud trhas radek, musi byt na konci znak \ kterej rika, "nasledujici radek je pokracovani stavajiciho"...
-
jak pise gll, pokud trhas radek, musi byt na konci znak \ kterej rika, "nasledujici radek je pokracovani stavajiciho"...
V shelli za pipe netreba backslash, pocita sa s nim automaticky.
Ja by som odmazal posledny znak v prvom riadku.
-
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
while read usep partition; do
echo "Running out of space \"$partition ($usep)\""|
mailx -s "Alert: Almost out of disk space $usep" email@server.com
done
-
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
while read usep partition; do
echo "Running out of space \"$partition ($usep)\""|
mailx -s "Alert: Almost out of disk space $usep" email@server.com
done
Děkuji moc za tip, ovšem stále se potýkám se stejným problémem, že to nechce zbaštit "done" hlásí to po testu vašeho scriptu
syntax error at line 5 : `done' unexpected říkám si, jestli není někde zakopaný pes kvůli HP-UX?
-
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
while read usep partition; do
echo "Running out of space \"$partition ($usep)\""|
mailx -s "Alert: Almost out of disk space $usep" email@server.com
done
Děkuji moc za tip, ovšem stále se potýkám se stejným problémem, že to nechce zbaštit "done" hlásí to po testu vašeho scriptu
syntax error at line 5 : `done' unexpected říkám si, jestli není někde zakopaný pes kvůli HP-UX?
Teď mi vlastně došlo, že "done" je bashovsky, nebo ne? Nění najaká shell alternativa, nebo ksh alternativa?
-
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
while read usep partition; do
echo "Running out of space \"$partition ($usep)\""|
mailx -s "Alert: Almost out of disk space $usep" email@server.com
done
Děkuji moc za tip, ovšem stále se potýkám se stejným problémem, že to nechce zbaštit "done" hlásí to po testu vašeho scriptu
syntax error at line 5 : `done' unexpected říkám si, jestli není někde zakopaný pes kvůli HP-UX?
Vzhledem k tomu, že mně to v Bashi na Linuxu normálně funguje, tak bych také viděl problém v nějaké specialitě HP-UX. Zkusil bych odebírat řádky, např. volání mailx. Mělo by to jen vypsat výsledek na monitor.
-
Teď mi vlastně došlo, že "done" je bashovsky, nebo ne? Nění najaká shell alternativa, nebo ksh alternativa?
Funguje mi to i v sh.
-
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?
-
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?
csh tam je, ale nevím jak zjistit jestli nemá puštěny nějaký while. Dá se to nějak vyšťourat?
-
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?
csh tam je, ale nevím jak zjistit jestli nemá puštěny nějaký while. Dá se to nějak vyšťourat?
Zkus místo "done" napsat "end".
-
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?
csh tam je, ale nevím jak zjistit jestli nemá puštěny nějaký while. Dá se to nějak vyšťourat?
Zkus místo "done" napsat "end".
Vypadá to, že jsi měl zřejmě pravdu
./disk_check.sh: ^M: not found
./disk_check.sh: syntax error at line 2 : `while' unmatched
-
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
while read usep partition; do
echo "Running out of space \"$partition ($usep)\""|
mailx -s "Alert: Almost out of disk space $usep" email@server.com
done
naco je tam vobec ten cyklus? text emailu naformatujem v tom awk a prepipujem do mailx. ci mi nieco unika?
-
Vypadá to, že jsi měl zřejmě pravdu
./disk_check.sh: ^M: not found
./disk_check.sh: syntax error at line 2 : `while' unmatched
Takže když tam vrátíš "done", uložíš do souboru a na začátek napíšeš "#!/bin/sh", tak by to mělo fungovat.
-
naco je tam vobec ten cyklus? text emailu naformatujem v tom awk a prepipujem do mailx. ci mi nieco unika?
Když to takhle uděláš, tak se e-mail pošle pokaždé, což určitě nechceme. Také by byl problém naplnit parametr "-s".
Dal by se však zavolat mailx přímo z awk, což by mohlo být zajímavé řešení.
-
Vypadá to, že jsi měl zřejmě pravdu
./disk_check.sh: ^M: not found
./disk_check.sh: syntax error at line 2 : `while' unmatched
Takže když tam vrátíš "done", uložíš do souboru a na začátek napíšeš "#!/bin/sh", tak by to mělo fungovat.
Nuže..zadal jsem cestu do ke svému "sh"
#!/usr/bin/sh
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
while read usep partition; do
echo "Running out of space \"$partition ($usep)\""|
mailx -s "Alert: Almost out of disk space $usep" email@server.com
done
Ale error stále stejný..
./disk_check.sh[2]: ^M: not found.
./disk_check.sh[3]: Syntax error at line 6 : `done' is not expected.
Nejsem si jistý co je špatně, zkoušel jsem použít místo "sh" obdobu "ksh" tedy #!/usr/bin/ksh ale to mi vyplivlo stejný error na s řádkem 6.
-
Když to takhle uděláš, tak se e-mail pošle pokaždé, což určitě nechceme.
neposle, ved v tom awk je podmienka, dalej prejdu len riadky s $5>90
Také by byl problém naplnit parametr "-s".
to ano, subject by musel byt genericky
Dal by se však zavolat mailx přímo z awk, což by mohlo být zajímavé řešení.
to ano, ale osobne nemam rad taketo volania z awk.
-
Když to takhle uděláš, tak se e-mail pošle pokaždé, což určitě nechceme.
neposle, ved v tom awk je podmienka, dalej prejdu len riadky s $5>90
Prázdný string je také string, mailx pošle prázdnou zprávu. To nechceš.
-
./disk_check.sh[2]: ^M: not found.
./disk_check.sh[3]: Syntax error at line 6 : `done' is not expected.
To vypadá, jako kdybys měl dosovský konec řádku. Zkus hexdump.
-
Když to takhle uděláš, tak se e-mail pošle pokaždé, což určitě nechceme.
neposle, ved v tom awk je podmienka, dalej prejdu len riadky s $5>90
Prázdný string je také string, mailx pošle prázdnou zprávu. To nechceš.
ziadny prazdny string sa netlaci, ak $5<=90 tak awk neurobi vobec nic, netlacia sia prazdne riadky, proste dalej prechadzaju len riadky ktore maju $5>90
-
ziadny prazdny string sa netlaci, ak $5<=90 tak awk neurobi vobec nic, netlacia sia prazdne riadky, proste dalej prechadzaju len riadky ktore maju $5>90
Teď jsem to zkusil, při nesplnění podmínky se pošle prázdný e-mail.
-
ziadny prazdny string sa netlaci, ak $5<=90 tak awk neurobi vobec nic, netlacia sia prazdne riadky, proste dalej prechadzaju len riadky ktore maju $5>90
Teď jsem to zkusil, při nesplnění podmínky se pošle prázdný e-mail.
erik@E5570:~$ df | tr -d '%' | wc -l
21
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
-
erik@E5570:~$ df | tr -d '%' | wc -l
21
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
K čemu tam máš to zbytečné "tr"? Tímto příkazem se vždy odešle minimálně jeden řádek. Jenže e-mail chceme poslat pouze v případě, když je na některém oddílu překročena kvóta. Jinak nesmí být odeslán ani prázdný string.
-
./disk_check.sh[2]: ^M: not found.
./disk_check.sh[3]: Syntax error at line 6 : `done' is not expected.
To vypadá, jako kdybys měl dosovský konec řádku. Zkus hexdump.
To HP-UX bohužel neumí a instalace by si vyžádala žádost, která se vyřídí až za týden :))
-
./disk_check.sh[2]: ^M: not found.
./disk_check.sh[3]: Syntax error at line 6 : `done' is not expected.
To vypadá, jako kdybys měl dosovský konec řádku. Zkus hexdump.
To HP-UX bohužel neumí a instalace by si vyžádala žádost, která se vyřídí až za týden :))
No tak ten konec druhého řádku oprav nějakým editorem. Třeba do toho vrtal někdo s NotePadem :D
-
To vypadá, jako kdybys měl dosovský konec řádku. Zkus hexdump.
To HP-UX bohužel neumí a instalace by si vyžádala žádost, která se vyřídí až za týden :))
Primitivní hexdump si napíšeš i v tom awk, určitě se ti bude hodit někdy později.
Ve Vimu však dosovské řádky uvidíš na první pohled.
-
Nakonec sem to smazal a vložil znovu ve vim, asi to někdo dělal skutečně v nějakém texťáku ve winu :)
Teď už jen zbejvá zjístit, proč to emaily nepošle. Vidím to na nefunkční mailx. Každopádně děkuji za rady, pomohly :)
-
Nakonec sem to smazal a vložil znovu ve vim, asi to někdo dělal skutečně v nějakém texťáku ve winu :)
Teď už jen zbejvá zjístit, proč to emaily nepošle. Vidím to na nefunkční mailx. Každopádně děkuji za rady, pomohly :)
Zkus, jestli tam ten mailx vůbec máš - ať víš, že si máš poslat žádost, která bude vyřízena za týden :)
-
erik@E5570:~$ df | tr -d '%' | wc -l
21
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
K čemu tam máš to zbytečné "tr"? Tímto příkazem se vždy odešle minimálně jeden řádek. Jenže e-mail chceme poslat pouze v případě, když je na některém oddílu překročena kvóta. Jinak nesmí být odeslán ani prázdný string.
aby som zmazal nalepene % za cislom aby awk mohol pracovat s $6 ako s cislom.
ziaden riadok sa neodosle, vobec si to neskusal
-
Nakonec sem to smazal a vložil znovu ve vim, asi to někdo dělal skutečně v nějakém texťáku ve winu :)
Teď už jen zbejvá zjístit, proč to emaily nepošle. Vidím to na nefunkční mailx. Každopádně děkuji za rady, pomohly :)
Zkus, jestli tam ten mailx vůbec máš - ať víš, že si máš poslat žádost, která bude vyřízena za týden :)
Je tam, ale nějak rozbity, má v sobě quote asi 900 mailů, asi sem našel kostlivce ve skříni :)
-
erik@E5570:~$ df | tr -d '%' | wc -l
21
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
K čemu tam máš to zbytečné "tr"? Tímto příkazem se vždy odešle minimálně jeden řádek. Jenže e-mail chceme poslat pouze v případě, když je na některém oddílu překročena kvóta. Jinak nesmí být odeslán ani prázdný string.
aby som zmazal nalepene % za cislom aby awk mohol pracovat s $6 ako s cislom.
ziaden riadok sa neodosle, vobec si to neskusal
AWK s tím $5 bude pracovat jako s číslem, ten znak "%" mu nevadí. I kdyby, tak to snadno ošetříš přímo v awk.
Když místo "wc -l" dáš "mailx", tak odešle.
-
erik@E5570:~$ df | tr -d '%' | wc -l
21
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
K čemu tam máš to zbytečné "tr"? Tímto příkazem se vždy odešle minimálně jeden řádek. Jenže e-mail chceme poslat pouze v případě, když je na některém oddílu překročena kvóta. Jinak nesmí být odeslán ani prázdný string.
aby som zmazal nalepene % za cislom aby awk mohol pracovat s $6 ako s cislom.
ziaden riadok sa neodosle, vobec si to neskusal
AWK s tím $5 bude pracovat jako s číslem, ten znak "%" mu nevadí. I kdyby, tak to snadno ošetříš přímo v awk.
Když místo "wc -l" dáš "mailx", tak odešle.
ty musis byt nejaky troll:
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
erik@E5570:~$ df | awk '{if ($6>90) print}' | wc -l
1
navyse existuje (aj ked neviem od akej verzie):
-E Don't send messages with an empty body.
-
ty musis byt nejaky troll:
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
erik@E5570:~$ df | awk '{if ($6>90) print}' | wc -l
1
navyse existuje (aj ked neviem od akej verzie):
-E Don't send messages with an empty body.
Výsledek "1" značí, že na výstupu máš alespoň jeden řádek. Zkus odstranit "| wc -l" a uvidíš ho. Hodnota se nenachází v $6, ale v $5, proto ti to vyhazuje různé výsledky.
-
ty musis byt nejaky troll:
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
erik@E5570:~$ df | awk '{if ($6>90) print}' | wc -l
1
navyse existuje (aj ked neviem od akej verzie):
-E Don't send messages with an empty body.
Výsledek "1" značí, že na výstupu máš alespoň jeden řádek. Zkus odstranit "| wc -l" a uvidíš ho. Hodnota se nenachází v $6, ale v $5, proto ti to vyhazuje různé výsledky.
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}'
Filesystem Type Size Used Avail Use Mounted on
/dev/loop0 squashfs 198M 198M 0 100 /snap/vlc/365
/dev/loop1 squashfs 87M 87M 0 100 /snap/core/4486
/dev/loop4 squashfs 87M 87M 0 100 /snap/core/4571
/dev/loop2 squashfs 104M 104M 0 100 /snap/pac-vs/1
/dev/loop3 squashfs 91M 91M 0 100 /snap/tusk/12
/dev/loop5 squashfs 93M 93M 0 100 /snap/tusk/15
/dev/loop6 squashfs 181M 181M 0 100 /snap/vlc/190
/dev/loop7 squashfs 87M 87M 0 100 /snap/core/4650
/dev/loop8 squashfs 103M 103M 0 100 /snap/tusk/16
erik@E5570:~$ df | awk '{if ($6>90) print}'
Filesystem Type Size Used Avail Use% Mounted on
-
Zdá se že máš jiný df než my - já mám df (GNU coreutils) 8.28 a zaplnění je v $5
$ LANG=C df | awk '{if ($5>50) print}'
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 209715696 137891940 71823756 66% /w10
/dev/sda7 119172348 86689888 26405788 77% /home
$ LANG=C df | awk '{if ($6>50) print}'
Filesystem 1K-blocks Used Available Use% Mounted on
Chování mám totožné, ať už % ruším nebo ne
$ LANG=C df | tr -d '%' | awk '{if ($6>50) print}'
Filesystem 1K-blocks Used Available Use Mounted on
$ LANG=C df | tr -d '%' | awk '{if ($5>50) print}'
Filesystem 1K-blocks Used Available Use Mounted on
/dev/sda2 209715696 137891940 71823756 66 /w10
/dev/sda7 119172348 86689924 26405752 77 /home
-
ty musis byt nejaky troll:
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}' | wc -l
10
erik@E5570:~$ df | awk '{if ($6>90) print}' | wc -l
1
navyse existuje (aj ked neviem od akej verzie):
-E Don't send messages with an empty body.
Výsledek "1" značí, že na výstupu máš alespoň jeden řádek. Zkus odstranit "| wc -l" a uvidíš ho. Hodnota se nenachází v $6, ale v $5, proto ti to vyhazuje různé výsledky.
erik@E5570:~$ df | tr -d '%' | awk '{if ($6>90) print}'
Filesystem Type Size Used Avail Use Mounted on
/dev/loop0 squashfs 198M 198M 0 100 /snap/vlc/365
/dev/loop1 squashfs 87M 87M 0 100 /snap/core/4486
/dev/loop4 squashfs 87M 87M 0 100 /snap/core/4571
/dev/loop2 squashfs 104M 104M 0 100 /snap/pac-vs/1
/dev/loop3 squashfs 91M 91M 0 100 /snap/tusk/12
/dev/loop5 squashfs 93M 93M 0 100 /snap/tusk/15
/dev/loop6 squashfs 181M 181M 0 100 /snap/vlc/190
/dev/loop7 squashfs 87M 87M 0 100 /snap/core/4650
/dev/loop8 squashfs 103M 103M 0 100 /snap/tusk/16
erik@E5570:~$ df | awk '{if ($6>90) print}'
Filesystem Type Size Used Avail Use% Mounted on
Jak se ti tam dostal sloupec "Type"? Ten ve standardním výstupu df není a vypisuje se pouze s parametrem "-T".
Druhý výstup jsou hlavičky, které jsou také textem a které se tím e-mailem odešlou. Ovšem to jsme už vyřešili regulárem výše. Když to také odfiltruješ, tak ti vyleze na stdout prázdný string.
Zřejmě používáš jiné awk. V mém případě je to gawk, kterému ta procenta za číslem nevadí.
-
Zdá se že máš jiný df než my - já mám df (GNU coreutils) 8.28 a zaplnění je v $5
Záleží na tom, jak má nastavený alias. Mám to takhle:
alias df='LANG=POSIX df'
Stačí jen přidat parametr, a hned je to v jiném sloupci:
alias df='LANG=POSIX df -T'
-
Jo, parametr, to mě mohlo napadnout :)