Nowe posty

Autor Wątek: [BASH] If w If'ie - skrypt nie wykonuje drugiego then  (Przeczytany 4085 razy)

kapio

  • Gość
Witam, mam pewien problem, a dokładnie piszę sobie skrypt i chce zrobić coś takiego
if [[ `komenda` ]]
then
echo "Cos nie tak"
else
echo "Czekaj sprawdze cos jeszcze"
   if [[ `komenda2` ]]
   then
   {komenda3}
   echo "Tak działa :)"
   else
   echo "Jednak nie"
   fi
fi
i zawsze pokazuje drugie else, a drugiego then nawet nie wykonuje. Gdzie może być problem?
Tak to wygląda
function start {

if [[ `ps --user $USER | grep $SCBIN` ]]
then
echo -e "\\E[31m[ERROR]\\033[0m Serwer Shoutcast jest juz uruchomiony!"
else
su $USER -c $SCHOME/$SCBIN $SCHOME/$SCCONFIG 2&>>$SCHOME/$SCLOGS &
        if [[ `ps --user $USER | grep $SCBIN` ]]
        then
         ps --user $USER | grep $SCBIN | cut -c 1-9 | tr -d [:alpha:] > $SCHOME/$SCPID
         echo -e "\\E[32m[OK]\\033[0m Serwer Shoutcast zostal uruchomiony!"
        else
         echo -e "\\E[31m[ERROR]\\033[0m Serwer nie mogl zostac uruchomiony! Sprawdz plik $SCLOGS!"
        fi
fi
}
Czyli nie wykonuje tego
then
         ps --user $USER | grep $SCBIN | cut -c 1-9 | tr -d [:alpha:] > $SCHOME/$SCPID
         echo -e "\\E[32m[OK]\\033[0m Serwer Shoutcast zostal uruchomiony!"
od razu przechodzi do else i pokazuje błąd. A tak naprawdę serwer uruchomił się poprawnie.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
[BASH] If w If'ie - skrypt nie wykonuje drugiego then
« Odpowiedź #1 dnia: 2012-09-29, 23:31:46 »
Cytuj
if [[ `komenda` ]]
Co to ma sprawdzać?

Czy komenda zwróciła zerowy kod wyjścia?
To wtedy:
if komenda; then
    ...
fi
Czy może chodzi o wynik działania na standardowym wyjściu, czyli to co "wypluła" aplikacja?
Na przykład że wyjście jest niepuste:
if [ -n "$( komenda )" ]; then
    ...
fi

snajper_8383

  • Gość
[BASH] If w If'ie - skrypt nie wykonuje drugiego then
« Odpowiedź #2 dnia: 2012-09-30, 00:21:04 »
Tak jak wyżej. Jeżeli przechodzi ci do else to znaczy, że warunek nie został spełniony. I wydaje mi się, że tu należy szukać błędu. Z tego co piszesz to pierwszy warunek nie został spełniony i przechodzi do else i tam dałeś drugi warunek taki sam, jak pierwszy, i też nie został spełniony i znowu przechodzi do else. Czyli ja bym się zastanowił nad tym fragmentem kodu:
if [[ `ps --user $USER | grep $SCBIN` ]]
Taka sugestia.
Pozdro:)

kapio

  • Gość
[BASH] If w If'ie - skrypt nie wykonuje drugiego then
« Odpowiedź #3 dnia: 2012-09-30, 12:58:21 »
Znaczy to działa tak
./shoutcast.sh start
pierwsze co robi to sprawdza czy serwer jest uruchomiony;
jeśli jest otrzymujemy
Serwer Shoutcast jest juz uruchomiony!
jeśli nie to idzie dalej i odpala go
su $USER -c $SCHOME/$SCBIN $SCHOME/$SCCONFIG 2&>>$SCHOME/$SCLOGS &
potem jest sprawdzenie czy serwer został uruchomiony bez problemu
ps --user $USER | grep $SCBIN
jeśli tak to powinno robić then
then
         ps --user $USER | grep $SCBIN | cut -c 1-9 | tr -d [:alpha:] > $SCHOME/$SCPID
         echo -e "\\E[32m[OK]\\033[0m Serwer Shoutcast zostal uruchomiony!"
a jeśli nie to otrzymujemy komunikat
Serwer nie mogl zostac uruchomiony! Sprawdz plik $SCLOGS!
czyli jest błąd w konfiguracji czy gdzieś indziej. Zmieniłem na tak
function start {
if [[ `ps --user $USER | grep $SCBIN` ]]; then
echo -e "\\E[31m[ERROR]\\033[0m Serwer Shoutcast jest juz uruchomiony!"
else
su $USER -c nohup $SCHOME/$SCBIN  $SCHOME/$SCCONFIG 2&>>$SCHOME/$SCLOGS &
                if [[ `ps --user $USER | grep $SCBIN` ]]; then
                ps --user $USER | grep $SCBIN | cut -c 1-9 | tr -d [:alpha:] > $SCHOME/$SCPID
                echo -e "\\E[32m[OK]\\033[0m Serwer Shoutcast zostal uruchomiony!"
                else
                echo -e "\\E[31m[ERROR]\\033[0m Serwer Shoutcast nie mogl zostal uruchomiony! Sprawdz plik $SCLOGS!"
                fi
fi
}
i o dziwo działało. I po chwili zmieniłem pozycję jednej zmiennej (z połowy kodu na początek) i znowu nic. Przywróciłem tą zmienną na jej stare miejsce i znowu nic.

Właśnie uruchomiłem skrypt i znowu zadziałało, ale tylko jeden raz!. Zatrzymałem serwer i chciałem powtórzyć start i już znowu od razu error, ale serwer się uruchamia. W ogóle o co chodzi? Raz działa, a raz nie.

snajper_8383 ta komenda działa prawidłowo bo mam ją też w funkcji status która działa idealnie.

xavery

  • Gość
[BASH] If w If'ie - skrypt nie wykonuje drugiego then
« Odpowiedź #4 dnia: 2012-10-01, 12:41:55 »
Pogubiłem się w tych if'ach i wielokrotnie wykonywanych tych samych testach ale na szybko mam taką uwagę, że do sprawdzania czy dany proces jest w systemie znacznie lepiej nadaje się pgrep a nawet kill (killall).

Przykłady zastosowań:

pgrep -u $USER $PROCNAME 

kill -0 $PID

killall -q -0 $PROCNAME
Powyższe polecenia zwracają prawdę gdy jest co najmniej jeden taki proces. Szczególnie wersja killall jest fajna bo operuje na nazwie procesu (a nie identyfikatorze) i od razu ma opcję -q nie wywalającą niczego na terminal.

xavery

  • Gość
[BASH] If w If'ie - skrypt nie wykonuje drugiego then
« Odpowiedź #5 dnia: 2012-10-01, 13:07:16 »
A na drugi rzut oka to może być problem z cytowaniem polecenia do wykonania przez su. Moim zdaniem powinno to być raczej cos w tym stylu:

su $USER -c "nohup...."
No i lepiej wpleść uruchamianie procesu w warunek if'a niż uruchamiać i w następnym ułamku sekundy sprawdzać obecność procesu - może jeszcze nie być procesu o podanej nazwie.

if [[ su $USER -c "nohup..." ]]

kapio

  • Gość
[BASH] If w If'ie - skrypt nie wykonuje drugiego then
« Odpowiedź #6 dnia: 2012-10-01, 17:38:45 »
Dzięki Wielkie :) Użyłem pgrep i działa idealnie.