Portál AbcLinuxu, 19. dubna 2024 23:12


Dotaz: basch script a podmínka

24.5.2011 19:12 Martin
basch script a podmínka
Přečteno: 313×
Odpovědět | Admin

Dobrý den, potřeboval bych poradit se scriptem. Mám script pomocí kterého do souboru zapíšu [OK]. Pokud je tato podmínka splněna tak se vše ukončí se zápisem do logu. Pokud místo "echo "[OK] 2011-05-24 18:23:50" > $LOGNAME" zadám "echo "[OOOK] 2011-05-24 18:23:50" > $LOGNAME, tak vše taky proběhne tak jak má a zapíše se do error logu.

Potřeboval bych udělat to aby když bude vše OK, tak aby se mi spustil ještě jedena část a to konkrétně toto: echo "[PAIR] 2011-05-24 18:23:50" > $LOGNAME2 ale jen v případě toho že předchozí podmínka bude OK. Jinak ať se vše okončí tím že se zapíše do error logu error, ale logname2 se nevytvoří.

 

cat test.sh
#!/bin/bash

COMPANY="Test"
SLEEP="2"
TRIES="3"

# let it "as is" until you know what you're doing
SCRIPTNAME="$0"
SCRIPTPATH=$(cd ${SCRIPTNAME%/*} && pwd)
LOGNAME="$SCRIPTPATH/log/stop_$$.log"
LOGNAME2="$SCRIPTPATH/log/pair-_$$.log"
LASTSTATUS="$SCRIPTPATH/log/laststatus.log"
ERRLOGS="$SCRIPTPATH/log/errors"
OKLOGS="$SCRIPTPATH/log/allright"
COUNT="0"


checklog(){
if [ ! -f $1 ] ; then
return 1
elif [ $(tail -n 1 $1 | grep -c '^\[WARNING\]') -eq 1 ] ; then
return 2
elif [ $(tail -n 1 $1 | grep -c '^\[OK\]') -eq 0 ] ; then
return 1
else
return 0
fi
}

# better to run as www user and with mutt installed
[ -d $ERRLOGS ] || mkdir -p $ERRLOGS
[ -d $OKLOGS ] || mkdir -p $OKLOGS

while [ $COUNT -lt $TRIES ]; do
if ! checklog $LOGNAME ; then

# real stop
echo "[OK] 2011-05-24 18:23:50" > $LOGNAME

# take some sleep after unsuccessful run
if [ $COUNT -gt 0 ] ; then
sleep $SLEEP
fi
# raise counter
COUNT=$((COUNT + 1))
else
# break counter
COUNT=$((TRIES + 1))
fi
done

[ -f $LOGNAME ] && TAIL=$(tail -n1 $LOGNAME)

# alert mail in case of any problem (and exit)
if ! checklog $LOGNAME ; then
echo -e "$COMPANY stop was not proceeded properly: $TAIL"  gzip -9 $LOGNAME
gzip -9 $LOGNAME
[ -d $ERRLOGS ] && mv $LOGNAME.gz $ERRLOGS/$(date +%Y%m%d_%H%M).gz
echo "$TAIL" > $LASTSTATUS
exit 0
fi

# delete logfile in the end of successful run
if [ -f $LOGNAME ] ; then
gzip -9 $LOGNAME
[ -d $OKLOGS ] && mv $LOGNAME.gz $OKLOGS/$(date +%Y%m%d_%H%M).gz
fi

# "OK mail" in case of successful run after previous error run
if ! checklog $LASTSTATUS ; then
echo -e "$COMPANY stop is all right now.\n\nScript exited with [OK] string. Number of tries: $TRIES. Here is last line from script: $TAIL"
fi

# log last output line to statusfile for test and "OK mail" eventually
echo "$TAIL" > $LASTSTATUS

exit 0

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

24.5.2011 21:12 Mercuriuz | skóre: 16 | blog: Mercuriuz | V hospodě =)
Rozbalit Rozbalit vše Re: basch script a podmínka
Odpovědět | | Sbalit | Link | Blokovat | Admin
nevím jestli sem úplně pochopil co potřebuješ, ale takhle by to mělo fungovat n?
cat test.sh 
#!/bin/bash
COMPANY="Test"
SLEEP="2"
TRIES="3"

# let it "as is" until you know what you're doing
SCRIPTNAME="$0"
SCRIPTPATH=$(cd ${SCRIPTNAME%/*} && pwd)
LOGNAME="$SCRIPTPATH/log/stop_$$.log"
LOGNAME2="$SCRIPTPATH/log/pair-_$$.log"
LASTSTATUS="$SCRIPTPATH/log/laststatus.log"
ERRLOGS="$SCRIPTPATH/log/errors"
OKLOGS="$SCRIPTPATH/log/allright"
COUNT="0"


checklog(){
if [ ! -f $1 ] ; then
return 1
elif [ $(tail -n 1 $1 | grep -c '^\[WARNING\]') -eq 1 ] ; then
return 2
elif [ $(tail -n 1 $1 | grep -c '^\[OK\]') -eq 0 ] ; then
return 1
else
return 0
fi
}

# better to run as www user and with mutt installed
[ -d $ERRLOGS ] || mkdir -p $ERRLOGS
[ -d $OKLOGS ] || mkdir -p $OKLOGS

while [ $COUNT -lt $TRIES ]; do
if ! checklog $LOGNAME ; then

# real stop
echo "[OK] 2011-05-24 18:23:50" > $LOGNAME
echo "[PAIR] 2011-05-24 18:23:50" > $LOGNAME2

# take some sleep after unsuccessful run
if [ $COUNT -gt 0 ] ; then
sleep $SLEEP
fi
# raise counter
COUNT=$((COUNT + 1))
else
# break counter
COUNT=$((TRIES + 1))
fi
done

[ -f $LOGNAME ] && TAIL=$(tail -n1 $LOGNAME)

# alert mail in case of any problem (and exit)
if ! checklog $LOGNAME ; then
echo -e "$COMPANY stop was not proceeded properly: $TAIL"  gzip -9 $LOGNAME
gzip -9 $LOGNAME
[ -d $ERRLOGS ] && mv $LOGNAME.gz $ERRLOGS/$(date +%Y%m%d_%H%M).gz
echo "$TAIL" > $LASTSTATUS
exit 0
fi

# delete logfile in the end of successful run
if [ -f $LOGNAME ] ; then
gzip -9 $LOGNAME
[ -d $OKLOGS ] && mv $LOGNAME.gz $OKLOGS/$(date +%Y%m%d_%H%M).gz
fi

# "OK mail" in case of successful run after previous error run
if ! checklog $LASTSTATUS ; then
echo -e "$COMPANY stop is all right now.\n\nScript exited with [OK] string. Number of tries: $TRIES. Here is last line from script: $TAIL"
fi

# log last output line to statusfile for test and "OK mail" eventually
echo "$TAIL" > $LASTSTATUS

exit 0
priste to prosim dej jako formatovanej kod, lip se to pak cte ;-)
Linux users everywhere, raise your keyboards into the air, we´re warriors, warriors of the world.
24.5.2011 21:20 Martin
Rozbalit Rozbalit vše Re: basch script a podmínka
ne to není ono co potřebuji, potřebuji aby se to druhé echo vypsalo jen v případě že ta první podmínka bude OK. Pokud dopadne špatně tak aby se to druhé echo vůbec nezapsalo.
24.5.2011 22:07 Mercuriuz | skóre: 16 | blog: Mercuriuz | V hospodě =)
Rozbalit Rozbalit vše Re: basch script a podmínka
specifikuj prosim tu "prvni podminku"
Linux users everywhere, raise your keyboards into the air, we´re warriors, warriors of the world.
24.5.2011 21:30 NN
Rozbalit Rozbalit vše Re: basch script a podmínka
Odpovědět | | Sbalit | Link | Blokovat | Admin
if ! checklog $LOGNAME ; then
Mam pocit, ze tahle podminka vubec nenastane, jelikoz funkce checklog vzdy vrati hodnotu a tudiz je vzdy true ,ale mozna se pletu.
else
# break counter
COUNT=$((TRIES + 1))
Zaprve na co cekat (?) a zadruhe je jednoduzsi pouzit
break
Btw, proc vubec pouzivat ciklus, kdyz stejne kontrolujes jen posledni radek ?
# better to run as www user and with mutt installed
Really ?
# alert mail in case of any problem (and exit)
if ! checklog $LOGNAME ; then

# "OK mail" in case of successful run after previous error run
if ! checklog $LASTSTATUS ; then
Proc provadet tu samou vec trikrat, kdyz se da udelat jen nednou ?
SCRIPTNAME="$0"
TRIES="3"
Na co pouzivat promenne, kdyz je pouzijes jen jednou ?

silenost,

NN

PS: pouzivet tag pre diky..
24.5.2011 22:36 NN
Rozbalit Rozbalit vše Re: basch script a podmínka
SCRIPTPATH=$(cd ${SCRIPTNAME%/*} && pwd)
Coze? Tak takhle urcite ne..

NN
25.5.2011 05:34 Ash | skóre: 53
Rozbalit Rozbalit vše Re: basch script a podmínka
Podmínka ! checklog foo nastane v závislosti na návratové hodnotě funkce checklog (nula versus nenulová hodnota).

Proměnné nejí něco, co "nahrazuje věci které se dělají víckrát". Proměnné jsou i symbolická jména a rovněž mohou plnit funkci konfiguračních proměnných.

25.5.2011 06:03 Ash | skóre: 53
Rozbalit Rozbalit vše Re: basch script a podmínka
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vidím že tam nikde nepoužíváte žádné stavové proměnné, rozhodně checklog by bylo lepší volat jen jednou, možná by pomohlo něco jako:
company_exited_flawlessly=false

if checklog $LOGNAME ; then
company_exited_flawlessly=true
else
company_exited_flawlessly=false
fi

(nebo víc skripťácky:
checklog $LOGNAME && company_exited_flawlessly=true
)

if $company_exited_flawlessly; then
...
else
...
fi
a to i v jiných místech.

Pro ukončení smyčky lépe použít break (jak radí NN).

Funkci checklog bych zlidštil a asi i nějak přejmenoval, aby už její název evokoval, jestli se v případě úspěchu očekává 0 nebo spíš 1. Dost to pomáhá čitelnosti, zvlášť pokud výsledek ještě navíc negujete (! checklog). Pokud by takových funkciček a podmínek bylo víc, umí to pokazit den.
log_ok(){
if [ -f $1 ] ; then
  if [ $(tail -n 1 $1 | grep -c '^\[OK\]') -eq 1 ] ; then
     return 0
   fi
fi
return 1
}

log_ok $LOGNAME && company_exited_flawlessly=true
P.S. Jestli jsem funkci checklog někde použil obráceně tak se omlouvám, připadá mi že ji máte opačně, ale možná že ne, takhle po ránu bych fakt potřeboval spíš log_ok $LOGNAME && company_exited_flawlessly=true

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.