Strona 1 z 1

bash - wyszukiwanie, weryfikacja czy powstał plik i zliczanie plików

: 07 stycznia 2016, 05:30
autor: wic1
Witam,


Otrzymałem zadanie, by w BASH'u napisać skrypcik weryfikujący status wykonania innego skryptu.


Ponieważ nie mam specjalnie dostępu do tego innego skryptu to wstępnie wpadłem na weryfikację po wynikach czyli po wygenerowanych/powstałych plikach.


Skrypt główny dokonuje zrzutu danych do plików.
Powstają pliki o numeracji rosnącej względem kolejnych wykonań skryptu zaś sam zrzut jest kończony plikami podsumowującymi zrzut o specyficznej nazwie.




Przykładowo......
X odpowiada za ostatnią cyfrę danego roku a ???? jest to liczba rosnąca.


Pliki ciągłe...
BB_X011_????_zrzut.lol <-- Pliki wyświetlane kolejno.


Pliki kończące zrzut...
BB_MAIL_X011_????_zrzut.lol <-- Plik kończący zrzut.




Przykład...
BB_6011_1356_zrzut.lol
BB_6011_1357_zrzut.lol
BB_6011_1358_zrzut.lol
BB_6011_1359_zrzut.lol
BB_6011_1360_zrzut.lol
BB_6011_1361_zrzut.lol
i kończący dzisiejsze wywołanie skryptu ...
BB_MAIL_6011_1362_zrzut.lol




Muszę wykreować coś, co zliczy mi wygenerowane dziś pliki oraz powiadomi np mailem o zakończeniu zrzutu.


Wstępnie widzę to tak, by skrypt zliczał wszystkie pliki zrzutu od ostatniego pliku zawierającego w nazwie "MAIL" do następnego. Utworzenie nowego pliku z wpisem MAIL wygeneruje wysłanie maila np.


Zrzut zakończony. Wygenerowano 1056 plików.
Wodotryskiem będzie np zsumowanie wagi (zajętości) samego zrzutu ale to już daleki, dalszy plan.




Macie może jakieś sugestie?


Wstępnie googlam za komendami 'find', 'mail', 'grep' oraz za samym skrypceniem w bashu gdyż z programowania niestety jestem nogą a tu wypada zastosować jakieś zmienne. CO nie zmienia faktu, że warto się tego nauczyć.




Każda pomoc, szablon i sugestie są na wagę złota :)




Dziękuję i pozdrawiam!

: 07 stycznia 2016, 07:37
autor: LordRuthwen
Polecenia jakie Ci będą potrzebne:
ls lub find, zależy ja do tego podejdziesz
wc
mail
echo

Do zliczania wagi możesz użyć operacji arytmetycznych oraz: du

: 09 stycznia 2016, 16:17
autor: wic1
Tak więc plan mam taki....


Jeśli proces ID odpalenia skryptu nadal jest aktywny to szukaj plików nie starszych niż data odpalenia skryptu.


Po zakończeniu procesu odczekaj np 2 minuty i wyślij mail z zakończeniem i ilością zliczonych wierszy dla ls lub find dla plików.


Teraz to "tylko" ubrać w skrypt :(


Dodane:

Chwilowo wygląda to tak i jeszcze (oczywiście) nie działa jak powinno ponieważ wpierw czyta składnię z google i uczę się pisać skrypty a potem będę się zastanawiał, czemu to nie chce odpalić :P


Kod: Zaznacz cały

DT_UR= 'DATE'
zap.sh now
PID = $!
while [ $PID > 0 ]; do sleep 30
if [$PID = null]
then
    sleep 30
    ZLICZ= 'find (folder) -date => $DT_UR 'LOL*LOL_costam.lol' | wc -l'
        if (${ZLICZ} > 0 ); 
            then
            find (folder) -date => $DT_UR 'LOL*LOL_costam.lol' > zrzut.log
            echo Plik wygenerowano.
            echo "Wygenerowano ${ZLICZ} plików"  < zrzut.log| ailx -s "Zrzut wykonano" mail1(malpa)lol.com mail2(malpa)lol.com


        else
        echo Plików brak. Ponów wyładowanie.
exit


while true
do
done




Teraz zostaje to doprowadzić do działania.


PS: Czy proces puszczony przy pomocy at będzie widziany w skrypcie w formie jak powyżej?
Chodzi o to, że chciałem wyciągnąć procedID z skryptu który jest puszczony przy pomocy komendy at -f /katalog/zap.sh now
Skrypt odpala 2 inne skrypty również w trybie &.


Pomyślałem, że zamiast generować zapętlenie tak długo, jak skrypt działa to wywołam je po zakończeniu pracy skryptu i wynik będzie na tacy. Przynajmniej... w teorii. :)

: 20 stycznia 2016, 23:41
autor: wic1
Panowie, przypominam się z tematem. Jak doprowadzić to do działania gdyż pisałęm to na podstawie 'składni' znalezionych z netu a i tak nie działa.

Do tego dochodzi pytanie...
Chcę by skrypt zakończył działanie jeśli znajdzie inny skrypt. Nazwa jest tu poglądowa więc testowo używam skryptu, który nie robi nic tylko 'śpi' (sleep).

Kod: Zaznacz cały

SRY='ps -ef | grep -c sleep' 
EKOD=$? 
if [ ${SRY} -ge 1 ] && [ ${EKOD} =eq 0] 
then 
echo "Skrypt jest w trakcie - ktos juz go uruchomil" 
exit 1 
fi 


/home/blah/zap.sh & 


Generalnie (jak mniemam) powinien w takim wypadku raz się uruchomić za za drugim razem już nie. Tymczasem i tak się uruchamia... jakieś pomysły?

obecnie wygląda to tak (oczywiście nadal się wywala):
ktoś powie co robie w tym paskudztwie źle? :P
bo nie mogę tego doprowadzić do działania...

Kod: Zaznacz cały

SRY='ps -ef | grep -c bin'
EKOD=$?
if [ ${SRY} -g 1 ] && [ ${EKOD} =eq 0]
then 
     echo "Skrypt jest w trakcie - prawdopodobnie ktos juz uruchomil zrzut"
     exit 1
     fi


date > /home/blah/data_zrzutu.log
zap.sh &
echo "Zrzut rozpoczeto z data "


PID = $!
EKOD=$?


while [ ${PID} -ge 1 ] && [ ${EKOD} -eq 0]; do sleep 30
if [${PID} -z] 
then
    sleep 30
    ZLICZ= 'find /home/blah/ -newermt /home/blah/data_zrzutu.log 'LOL*LOL_costam.lol' | wc -l'
        if (${ZLICZ} -ne 0 ); 
            then
                find . -newermt /home/blah/data_zrzutu.log 'LOL*LOL_costam.lol' > /home/blah/zrzut.log
            echo Plik wygenerowano.
            echo /home/blah/data.log
            echo /home/blah/zrzut.log
            #echo "Wygenerowano ${ZLICZ} plików"  < zrzut.log| ailx -s "Zrzut wykonano" [email protected] [email protected]


        else
        echo Plików brak. Ponów wyładowanie.
exit


while true
do
done



: 21 stycznia 2016, 18:00
autor: marcin1982
Proszę nie pisać postu pod postem tylko używać opcji "Edycja wiadomości".