Strona 1 z 2

Ocena działania skryptu

: 19 września 2012, 17:55
autor: nyx
Witam.

Napisałem sobie prosty skrypt do uruchamiania pewnych analiz. Sprawdza on ilość wolnych licencji i jeśli jest wolna to uruchamia analizy, jeśli nie ma, czeka 3 minuty.
Uruchamiam go zdalnie na serwerze. Pytanie mam tylko, czy jest to programistycznie i technologicznie poprawnie.

Czy po wykonaniu polecenia:

Kod: Zaznacz cały

sleep
i wywołaniu tego samego pliku skryptowego ponownie nie tworze w systemie niepotrzebnych procesów, które są uśpione?

Rozważam sytuację, czy jeśli nie będzie wolnych licencji, przez np. 20 godzin nie stworzę tyle uśpionych procesów, że mnie admin zabije.

Jak to zrobić lepiej?

Plik ma nazwę an_start.sh:

Kod: Zaznacz cały

#!/bin/bash

lic=licencja

/bin/date +%D'   '%T >> log.txt
lic_all='lic_status | grep $lic | grep of | cut -c 29' 
lic_used='lic_status | grep $lic | grep of | cut -c 58'
lic_free=$[ lic_all-lic_free]

if [ "$lic_free" -gt 0 ];
then
echo "uruchomienie analizy" >> log.txt
else
echo "brak licencji - czekam" >> log.txt
sleep 3m
sh an_start.sh
fi

echo "_____" >> log.txt


Dziękuję za pomoc.
Pozdrawiam.

: 19 września 2012, 18:05
autor: Rafal_F
Jest źle.
1. Jeżeli skrypt ma co pewien czas coś robić to albo potrzebna jest pętla, albo skrypt powinien być co pewien czas uruchamiamy np cronem. W drugim przypadku kasujemy sleep 3m bo jest niepotrzebne.
2. Sprawdzasz czy ilość wolnych licencji jest większa od 0, ale analizę uruchamiasz w momencie braku licencji.

: 19 września 2012, 22:38
autor: nyx
Dziękuję za opinię.
A co powiesz na to?

Kod: Zaznacz cały

#!/bin/bash

lic=licencja


/bin/date +%D'   '%T >> log.txt
lic_all='lic_status | grep $lic | grep of | cut -c 29' 
lic_used='lic_status | grep $lic | grep of | cut -c 58'
lic_free=$[ lic_all-lic_used]

if ["$lic_free" -gt 0]
then
an_status=1
else
an_status=0
fi


while [ "$an_status" -ne 1 ]; do
    sleep 10m
    lic_all='lic_status | grep $lic | grep of | cut -c 29' 
    lic_used='lic_status | grep $lic | grep of | cut -c 58'
    lic_free=$[ lic_all-lic_used]

    if ["$lic_free" -gt 0]
    then
    an_status=1
    else
    an_status=0
    fi

done

echo "uruchomienie analizy" >> log.txt

: 19 września 2012, 23:01
autor: Rafal_F
Linijki:

Kod: Zaznacz cały

lic_all='lic_status | grep $lic | grep of | cut -c 29' 
    lic_used='lic_status | grep $lic | grep of | cut -c 58'
możesz zakomentować, za lic_all i lic_used powstawiać liczby, jakieś napisy debugujące w różnych momentach pęli, zmniejszyć sleep i uruchomić skrypt, żeby zobaczyć czy logicznie działa. Na razie w liniach (są takie 2):

Kod: Zaznacz cały

if ["$lic_free" -gt 0]
są błędy, powinno być:

Kod: Zaznacz cały

if [ $lic_free -gt 0 ]
chodzi o spacje, średniki nie są konieczne. W:

Kod: Zaznacz cały

lic_free=$[ lic_all-lic_used]
też brakuje spacji.

: 19 września 2012, 23:16
autor: nyx
Dziękuję za pomoc. Jutro sprawdzę, jak to działa w praktyce i zweryfikuję.
Ale problemów z mnożącymi się procesami, czy podobnych chyba nie muszę się obawiać?

: 19 września 2012, 23:22
autor: Rafal_F
Nie wiem jeszcze jak to ma działać:

Kod: Zaznacz cały

'lic_status | grep $lic | grep of | cut -c 29'
bo trochę dużo tych grep'ów.
Ale tych problemów o które się obawiasz nie powinno być.

: 19 września 2012, 23:28
autor: nyx
Z tym:

Kod: Zaznacz cały

lic_status

też mi się trochę nie podoba ale na końcu polecenie zwraca dokładną liczbę. Jutro sobie sprawdzę, jak to dokładnie wygląda, aby trochę zoptymalizować ten kod.

: 19 września 2012, 23:45
autor: Rafal_F
Nie, jak działa to nie ruszaj bo przestanie :p .

: 20 września 2012, 21:33
autor: nyx
Działa.
N
awet zoptymalizowałem trochę ten:

Kod: Zaznacz cały

lic_status | grep $lic | grep of | cut -c 29

Zmieniłem go na:

Kod: Zaznacz cały

lic_status | grep 'of licencja' | cut -c 29

Wcześniej po jednym poleceniu grep zwraca kilka wierszy i kolejne polecenie grep of zwracało jeden wiersz.
Teraz od razu mam jeden wiersz i na 29 znaku wycinam liczbę z ilością licencji.

A swoja drogo można jakoð z danego wiersza wyciągnąć jakąś liczbę (która się pojawia między tekstem), ale nie podając położenia tej liczby?

: 20 września 2012, 22:19
autor: Rafal_F
Jak liczba jest tylko jedna, to np tak:

Kod: Zaznacz cały

sed 's/[^0-9]//g'
Jak w linii będzie więcej liczb, to polecenie zwróci wszystkie liczby w jednym ciągu.