Skocz do zawartości

Operacje Na Plikach I Wysłanie Powiadomień


morg

Rekomendowane odpowiedzi

Witam

 

Mam taką strukturę katalogów w których są binaria. W kazdyk katalogu bazy ( np pierwsza_baza_z_wersji_1) znajdują się:

- wydrulki/wersja.log

- wydrulki/wersja.log.orig

- Roboczy/trwa_instalacja

 

├── wersja_1
│   ├── pierwsza_baza_z_wersji_1
│   │      ├── wydruki
│   │      │     ├── wersja.log
│   │      │     ├── wersja.log.orig
│   │      ├── Roboczy
│   │      │     ├── trwa_instalacja
│   ├── druga_baza_z_wersji_1
├── wersja_2
│   ├── pierwsza_baza_z_wersji_2
│   ├── druga_baza_z_wersji_2
│   ├── trzecia_baza_z_wersji_2
├── wersja_3
│   ├── pierwsza_baza_z_wersji_3
│   ├── druga_baza_z_wersji_3
│   ├── kopia_pierwszej_bazy_z_wersji_3
├── wersja_4
│   ├── pierwsza_baza_z_wersji_4
├── wersja_5
│   ├── pierwsza_baza_z_wersji_5
│   ├── druga_baza_z_wersji_5

 

Proces instalacji trwa około dwóch godzin, jest różny dla każdego z katalogów (różne serwery oraz instancje Oracle).

 

Podczas rozpoczęcia instalacji zmieniana jest nazwa pliku wydruki/wersja.log na wydruki/wersja.log.orig oraz tworzony pusty plik Roboczy/trwa_instalacja.

Gdy kończy się proces instalacji jest kasowany plik Roboczy/trwa_instalacja, egzekutor zapisuje wersje do nowo utworzonego pliku wydruki/wersja.log (w każdym katalogu bazy jest taki plik) mutt wysyła go do odbiorców, skrypt dodaje zawartość pliku wersja.log do wersja.log.orig:

 

cat wydruki/wersja.log >> wydruki/wersja.log.orig &&  mv wydruki/wersja.log.orig wydruki/wersja.log

 

Opracowałem powiadamianie po każdej instalacji, które świetnie się sprawowało jak bylo po 1 lub po 2 bazy w katalogu. W tej chwili znajduje się po 5, 6 baz. Wysłanie 40 mailu dziennie do użytkowników powoduje u nich wrustracje.

 

Poprawiłem wysyłke komunikatów.

Chciałem to zrobić by w zależności od istnienia pliku trwa_instalacja czekał na zakończenie a tym samym skasowanie pliku, a jeżeli nie istnieje plik wersja.log.orig do maila wstawiał informację, że na tej bazie nie była wykonywana instalacja.

 

Zrobiłem coś takiego:

 

 

export tutaj=$PWD
export kto=$LOGNAME
export glowny=${tutaj%/*}
export katalog=` ls $glowny `
export OstatniKatalog="$glowny/`ls $glowny |grep -v txt |grep -v class |grep -v dmp |grep -v tar |grep -v log |tail -1`"

serwern=`uname -n`
serwer=`uname`


# rm -Rf powiadom.txt
# serwer=`uname -n`
# echo "" >> powiadom.txt
# echo ======================================================================== >> powiadom.txt
# echo =========== WIADOMOSC AUTOMATYCZNA, NIE WYMAGA ODPOWIEDZI ============== >> powiadom.txt
# echo ======================================================================== >> powiadom.txt
# echo "" >> powiadom.txt
# echo "" >> powiadom.txt
# echo W katalogu:>> powiadom.txt
# echo $serwern:/$PWD >> powiadom.txt
# echo "" >> powiadom.txt
# echo "" >> powiadom.txt
# echo zainstalowano exe `cat exe/wersja.exe` >> powiadom.txt
# echo "" >> powiadom.txt
# cat wydruki/wersja.log >> powiadom.txt
# echo "" >> powiadom.txt
# echo "Pozdrawiam" >> powiadom.txt
# echo "$LOGNAME" >> powiadom.txt

#  mutt -s "Informacja o nowej wersji $rodzaj w katalogu $serwern:/$PWD ." $komu < powiadom.txt

# cat ./wydruki/wersja.log >>./wydruki/wersja.log.orig
# mv -f ./wydruki/wersja.log.orig ./wydruki/wersja.log
# rm -Rf Roboczy/UWAGA_* Roboczy/jaki* Roboczy/wersja* Roboczy/trwa_instalacja*




#  ZbiorowkaPowiadomien()
#  {
    if 
         [[ `echo $tutaj | awk 'BEGIN { FS="/"} {print $NF}'` =  `ls ../ |grep -v txt |grep -v class |grep -v dmp |grep -v tar |grep -v log |tail -1` ]]

             then 


               if [[ "`echo $tutaj | awk 'BEGIN { FS="/"} {print $NF}'`" =  "`echo  $OstatniKatalog | awk 'BEGIN { FS="/"} {print $NF}'`" ]] ; then 

                     rm $tutaj/Roboczy/trwa_instalacja

               fi


sprawdz() 
{ 
    if [[ -f $OstatniKatalog/Roboczy/trwa_instalacja  ]] ; then 

#                 if [[ "`echo $tutaj | awk 'BEGIN { FS="/"} {print $NF}'`" =  "`echo  $OstatniKatalog | awk 'BEGIN { FS="/"} {print $NF}'`" ]] ; then 
# 
#                       rm $tutaj/Roboczy/trwa_instalachja
# 
#                 fi

clear

                printf " \n\n\n   Czekam az zakonczy sie instalacja na $OstatniKatalog \n\n\n\t "  && sleep 60

       sprawdz
     else

                 printf "\n\n\n\t  Koniec ostatniej instalacji. Koncze prace. \n\n\n"

   fi 
}


        for a in `echo $katalog |xargs -n1 echo`; do  

                          if [[ -f $glowny/$a/Roboczy/trwa_instalacja ]] ; then

                                 ile=`ls $glowny/$a/Roboczy/trwa_instalacja |wc | awk '{print $1}'`

                          fi

                          if [[ $ile -ge 2 ]] ; then 

                               sprawdz 

                          else

                               Powiadom
                               koncowka

                          fi                  


        done









    ZrobZestawienie

                        case $rodzaj in


                         "uzupelnieniu definicji")
                                                       rm -Rf powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo ======================================================================== >> powiadom.txt
                                                       echo =========== WIADOMOSC AUTOMATYCZNA, NIE WYMAGA ODPOWIEDZI ============== >> powiadom.txt
                                                       echo ======================================================================== >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo W katalogu:>> powiadom.txt
                                                       echo $serwern:/$PWD >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo "zaimportowano nawrot definicji (defp, form, pola): " >> powiadom.txt
                                                       echo `ls defp*.txz | cut -d'.' -f1 ` >> powiadom.txt
                                                       echo `ls form*.txt | cut -d'.' -f1 ` >> powiadom.txt
                                                       echo `ls pola*.txt | cut -d'.' -f1 ` >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo "" >> powiadom.txt
#                                                         echo "Pozdrawiam" >> ../powiadom.txt
#                                                         echo "$LOGNAME" >> ../powiadom.txt
                                                       echo "Pozdrawiam" >> $glowny/zestawienie.txt
                                                       echo "$LOGNAME" >> $glowny/zestawienie.txt

                                                       ;;

                        *)

                                                       rm -Rf powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo ======================================================================== >> powiadom.txt
                                                       echo =========== WIADOMOSC AUTOMATYCZNA, NIE WYMAGA ODPOWIEDZI ============== >> powiadom.txt
                                                       echo ======================================================================== >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo W katalogu:>> powiadom.txt
                                                       echo $serwern:/$PWD >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       echo zainstalowano exe `cat exe/wersja.exe` >> powiadom.txt
                                                       echo "" >> powiadom.txt
                                                       cat wydruki/wersja.log >> powiadom.txt
                                                       echo "" >> powiadom.txt
#                                                         echo "Pozdrawiam" >> ../powiadom.txt
#                                                         echo "$LOGNAME" >> ../powiadom.txt
                                                       echo "Pozdrawiam" >> $glowny/zestawienie.txt
                                                       echo "$LOGNAME" >> $glowny/zestawienie.txt
                                                       ;;

                        esac



sprawdz_katalog() 
{ 
    if [[ -f $glowny/$katalog/Roboczy/trwa_instalacja  ]] ; then 

# clear

                printf " \n\n\n\t Czekam az sie zakonczy instalacja na $katalog ($Instalator)\n\n\n\t "  && sleep 10

       sprawdz
     else

                 printf "\n\n\n\t  Koniec ostatniej instalacji. Koncze prace. \n\n\n"

   fi 
}

# Cosik dziala:

# for a in `echo $katalog |xargs -n1 echo`; do  echo $glowny/$a/Roboczy; done
# teraz to modyfikuje
SprawdzCzyInstaluje()
{
if [[ -f $glowny/$a/Roboczy/trwa_instalacja ]] 
then 
echo czekam na $glowny/$a/Roboczy/trwa_instalacja
sleep 10
else
echo $a          zakonczona - nie czekam
unset $a
fi
}

czekaj10()
{
for a in `echo $katalog |xargs -n1 echo`; do  
# du $glowny/$a/Roboczy
SprawdzCzyInstaluje

done
}

# ZrobZestawienie_lol()
# {
#  for a in ` ls $glowny ` ; do 
# if [[ -f   $glowny/$a/Roboczy/trwa_instalacja ]] ; then 
# czekam  na $a
# sleep 1

# fi
# ZrobZestawienie_lol
# done
# }




#      if [[ -f $glowny/$a/Roboczy/trwa_instalacja  ]] ; then 

# clear

#                  printf " \n\n\n\t Czekam az sie zakonczy instalacja na $katalog ($Instalator)\n\n\n\t "  && sleep 1

#         sprawdz
#       else

#                   printf "\n\n\n\t  Koniec ostatniej instalacji. Koncze prace dla katalogu " $a" . \n\n\n"

#  exit
#     fi 

#  ZrobZestawienie_lol
# done
#   done
# ZrobZestawienie_lol
# }


# ZrobZestawienielol-orig()
# {
#   for katalog in `ls ../ |grep -v txt |grep -v class |grep -v dmp |grep -v tar |grep -v log` 
#   do 
#                     if [[ -f ../$katalog/wydruki/wersja.log.orig ]]; then 
# 
#                printf "\n\n\n $katalog \n\n\n" >>$glowny/zestawienie.txt
# 
#                                   cat ../$katalog/wydruki/wersja.log >>$glowny/zestawienie.txt
# 
#                              else 
# 
#                                   echo
# 
#                     fi
# 
#   done
# }




cat ../$katalog/wydruki/wersja.log >> ../$katalog/wydruki/wersja.log.orig &&  mv ../$katalog/wydruki/wersja.log.orig ../$katalog/wydruki/wersja.log



        mutt -s "Zbiorowka instalacji $rodzaj w katalogu $serwern:/$glowny/ ." $komu < $glowny/zestawienie.txt

        rm -f $glowny/zestawienie.txt

                       else 

                            echo "Komunikat o zbiorowce powiadomien "



fi

 

 

 

Problem w tym, że powiadomienia w żaden sposób nie chcą się zachowywać tak jakbym chciał. Zamiast jednego maila potrafi wysłac trzy w każdym inna zawartość, każda błędna.

 

Chciałbym aby skrypt potrafił się zachować w taki sposób:

 

- jeśli istnieje trwa_instalacja - czeka na koniec

- jeśli nie istnieje plik wydruki/wersja.log.orig - info, ze na tej bazie nie było instalacji

- w każdym innym przypadku wydrukowanie zawartości zbioru wersja.log do pliku zestawienie (zgodnie z funkcją ZrobZestawienie())

 

 

 

 

 

M.

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

ja to będę niemiły

1. używaj wcięć

2. funkcje do wszystkiego, a nie wtedy jak już się dostaje oczopląsu (podejdź do tego jak do kodu w c++/java)

3. nie przeliczaj pięć razy tego samego warunku patrz pkt. 2

4. parametry do wszystkiego

5. "sleep 60" ?!

6. "rm -Rf powiadom.txt" ?!

7. nie umieszczaj całego skryptu w jednym "if" :lammer:

 

próbowałem się temu przyjrzeć, ale chaos... ogarnij ten kod trochę i zapewne problem się wyklaruje

ps. "export" ma sens jeśli używasz subshell'a, a nie widzę żebyś używał. "unset" nie działa na zwykłe parametry (chyba tylko tablice i "set COŚ").

Odnośnik do komentarza
Udostępnij na innych stronach

posprzątałem to do funkcji

http://dl.dropbox.com/u/409786/pub/home/arch/forum/morg.lab

 

i stwierdzam:

*) ta funkcja jest bezsensu

cat ../$katalog/wydruki/wersja.log >>  ../$katalog/wydruki/wersja.log.orig && mv  ../$katalog/wydruki/wersja.log.orig  ../$katalog/wydruki/wersja.log

bo zapomniałeś, że $katalog to tak naprawdę lista katalogów, więc zadziała tylko dla jednego

 

*) wysyłanie maila

mutt -s "Zbiorowka instalacji $rodzaj w katalogu $serwern:/$glowny/ ." $komu < $zestawienie

nie wiele ma wspólnego z pokazanych przez Ciebie fragmentem kodu (chyba, że to jakaś zakomentowana część była)

 

*) funkcja sprawdz() zapętla się, bez usuwania pliku "trwa_instalacja" (no chyba, że ma działać równolegle)

 

więcej z tego fragmentu nie da się nic wypatrzeć

Odnośnik do komentarza
Udostępnij na innych stronach

  borzole napisał:
posprzątałem to do funkcji

http://dl.dropbox.com/u/409786/pub/home/arch/forum/morg.lab

 

i stwierdzam:

 

*) funkcja sprawdz() zapętla się, bez usuwania pliku "trwa_instalacja" (no chyba, że ma działać równolegle)

 

 

ad 1*) morg.lab musze sprawdzic w pracy bo przez zdalny dostep do firmy z demoniczna predkoscia 10 kb/s nie nadazam, poza tym zawiera funkcje ktore chcialbym sprawdzic.

ad 2*) funkcja sprawdz(). Idealem by byla funkcja ktora sprawdza czy w jakims katalogu jest jeszcze plik trwa_instalacja. Jesli nie napotka zadnego, powinna przejsc do funkcji powiadom() i wyslac powiadomienie. W kazdym innym przypadku posprzatac po sobie i exit.

Problemem dla mnie jest plik wersja.log. Tail na starych aixach, sunach nie dziala z parametrami ograniczajacymi ilosc pobieranych linii wedlug znacznikow wiec zdecydowalem sie na kopiowanie plikow.

 

 

 

Plik wersja.log jest mi niezbedny. Nie moze zostac skasowany.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Nie miałem jak tego sprawdzić i plik był robiony "na czuja" więc literówki na bank są !!

 

  morg napisał:
ad 2*) funkcja sprawdz(). Idealem by byla funkcja ktora sprawdza czy w jakims katalogu jest jeszcze plik trwa_instalacja. Jesli nie napotka zadnego, powinna przejsc do funkcji powiadom() i wyslac powiadomienie. W kazdym innym przypadku posprzatac po sobie i exit.
Tak na szybko. Można by pokombinować z sygnałami przerwań "trap costam HUP", ale polecenie trap odkryłem kilka dni temu i jeszcze nie za bardzo wiem jak go tu użyć.

   #!/bin/bash
   
   lock_file=$HOME/trwa_instalacja
   sprawdz(){
     clear
     if [[ -f $lock_file ]]; then
         printf " \r instaluje wirusa" && sleep 1
         for i in {1..5}; do
             [ ! -f $lock_file ] && break_loop
             printf " * " && sleep 1
         done
         sprawdz
     else
         break_loop
     fi
}

break_loop(){
     printf "\n [ $(date) ] \$ Skynet zyskuje świadomość \n"
     exit 0
}

set_lock(){
     printf " tworzę plik blokujący: $lock_file\n"
     touch $lock_file
}

rm_lock(){
     printf " usuwam plik blokujący: $lock_file\n"
     rm -f $lock_file
}

set_lock
# sprawdzanie w tle
sprawdz &
# demo jakiegoś procesu trwającego kilka sekund 
sleep 12
rm_lock

 

A odnośnie problemu z tail to może użyj sed.

Odnośnik do komentarza
Udostępnij na innych stronach

 

 

Rozwiązanie:

 

Błędnie założyłem, że ostatnia instalacja musi być wykonywana w ostatnim katalogu (ls ../ |tail -1).

 

Przemyślałem rozwiązania podesłane przez kolegę @borzole (dziękuję za pomoc) i udostępniam rozwiązanie:

 

# Ze zmiennej ktora tworzy liste wartosci tworze plik, ktory bedzie mozna dowolnie konwertowac:


echo $katalog |xargs -n1 echo >plik



robi plik z wersjami:


for plik in `cat plik`; do 
echo $plik >>plik_a 
cat $glowny/$plik/wydruki/wersja.log* |tail -10 >>plik_a

done




# Robi zestawienie co do ilosci instalacji 

for plik in `cat plik`; do 

if [[ -f $glowny/$plik/Roboczy/trwa_instalacja ]]; then

ls $glowny/$plik/Roboczy/trwa_instalacja >>./plik_b

fi
done

ile=cat plik_b |wc |awk '{ print $1 }'

# # if [[ $ile -ge 1 ]]; then
# # 
# # exit
# # 
# #      fi



if [[ $ile -eq 0 ]]; then

powiadomien

else 

exit


     fi

 

 

 

Opis:

 

Rozwiązanie nie wymaga zapętlenia.

 

W pliku tymczasowym plik_b zapisane są (jeśli istnieją) informacje o trwającej instalacji (Roboczy/trwa_instalacja). Zakonczenie jakiejkolwiek akcji instalacji kasuje plik trwa_instalacja. a sama akcja sprawdza wartość zmiennej $ile. Jeśli $ile jest wiekszy od "0" kończy instalację (a tym samym kasuje plik Roboczy/trwa_instalacja). W tym przypadku powinno zadziałać bo ostatnia instalacja sprawdzi, że nie ma już żadnego pliku w pozostałych katalogach, swój skasuje i nie utworzy pliku tymczasowego plik_b. Polecenie "wc" zwróci 0.

 

 

serwer:/katalog/bazodanowy rm plik_b; for plik in `cat plik`; do  if [[ -f $glowny/$plik/Roboczy/trwa_in
stalacja ]]; then ls $glowny/$plik/Roboczy/trwa_instalacja >>./plik_b;  fi; done; cat plik_b |wc |awk '{ print $
1 }'
rm: plik_b: A file or directory in the path name does not exist.
cat: 0652-050 Cannot open plik_b.
0
serwer:/katalog/bazodanowy

 

 

 

 

 

Dziękuję za pomoc.

 

 

M.

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...