morg Napisano Grudzień 10, 2009 Zgłoszenie Share Napisano Grudzień 10, 2009 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 More sharing options...
borzole Napisano Grudzień 10, 2009 Zgłoszenie Share Napisano Grudzień 10, 2009 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 More sharing options...
morg Napisano Grudzień 10, 2009 Autor Zgłoszenie Share Napisano Grudzień 10, 2009 To jest kilka linii z ponad 5 000. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Grudzień 10, 2009 Zgłoszenie Share Napisano Grudzień 10, 2009 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 More sharing options...
morg Napisano Grudzień 11, 2009 Autor Zgłoszenie Share Napisano Grudzień 11, 2009 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 More sharing options...
borzole Napisano Grudzień 11, 2009 Zgłoszenie Share Napisano Grudzień 11, 2009 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 More sharing options...
morg Napisano Grudzień 11, 2009 Autor Zgłoszenie Share Napisano Grudzień 11, 2009 Polecenie trap kompletnie odpada. W tej chwili jestem zalogowany na jednym z serwerów na konsoli oraz przez 2 ftpy, w tle działają demony konieczne dla innych aplikacji ps -ef |grep gburdzy |wc 33 417 4008 Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morg Napisano Grudzień 16, 2009 Autor Zgłoszenie Share Napisano Grudzień 16, 2009 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 More sharing options...
Rekomendowane odpowiedzi
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ę