Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: [BASH] If w If'ie - skrypt nie wykonuje drugiego then  (Przeczytany 4079 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.