Ocena dzia

Potrzebujesz pomocy z C, C++, perl, python, itp.
nyx
Posty: 8
Rejestracja: 08 sierpnia 2012, 23:37

Ocena działania skryptu

Post 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.
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post 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.
nyx
Posty: 8
Rejestracja: 08 sierpnia 2012, 23:37

Post 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
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post 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.
nyx
Posty: 8
Rejestracja: 08 sierpnia 2012, 23:37

Post 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ć?
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post 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ć.
nyx
Posty: 8
Rejestracja: 08 sierpnia 2012, 23:37

Post 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.
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

Nie, jak działa to nie ruszaj bo przestanie :p .
nyx
Posty: 8
Rejestracja: 08 sierpnia 2012, 23:37

Post 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?
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post 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.
ODPOWIEDZ