Nowe posty

Autor Wątek: Skrypt programu obsługującego proces w tle  (Przeczytany 4440 razy)

pigwabest

  • Gość
Skrypt programu obsługującego proces w tle
« dnia: 2013-03-07, 16:23:01 »
Witam. Zaczynam przygodę ze skryptami w bashu dlatego bardzo proszę o pomoc w poprawie skryptu napisanego przeze mnie. Program nie wywala błędów ale zawiesza się. A niżej treść zadania:
Program powinien uruchamiać proces w tle i zapisywać jego numer do pidfile.

    Posiada takie parametry: start, stop, status, restart
    Uruchomiony bez parametrów albo ze złymi wypisuje instrukcje użycia.
    Uruchomiony z poleceniem start powinien:
       - Sprawdzać czy proces jest uruchomiony
       - Jeśli tak wyświetla informacje i wyłącza się
       - Jeśli nie uruchamia go w tle i zapisuje PID
    Uruchomiony z poleceniem stop powinien:
       - Sprawdzać czy proces jest uruchomiony
       - Jeśli nie wyświetla informacje i wyłącza się
       - Jeśli tak to: prosi proces o zakończenie, czeka 2 sekundy, jeśli proces się nie zakończył wymusza zamknięcie.
    Uruchomiony z poleceniem status powinien:
       - Sprawdzać czy proces jest uruchomiony i wyświetlić informację
       - Jeśli nie wyświetla informacje i wyłącza się
       - Jeśli tak to: prosi proces o zakończenie, czeka 2 sekundy, jeśli proces się nie zakończył wymusza zamknięcie.
    Uruchomiony z poleceniem restart powinien:
       - Sprawdzać czy proces jest uruchomiony i wyświetlić informację
       - Jeśli jest uruchomiony wyświetla informacje i wyłącza się
       - Następnie uruchamia się

A niżej mój kod z co najmniej jednym niezrozumiałym dla mnie błędem:
#!/bin/bash

nano proces &
pidof nano > pidfile.txt
ZMIENNA =`cat pidfile.txt`

if [ "start" = $1 ]
then
if kill -0 $ZMIENNA
then
        echo "proces uruchomiony w tle"
        exit 0
else
        nano proces &
        pidof nano > pidfile.txt
        exit 0
fi
elif [ "stop" = $1 ]
then
if kill -0 $ZMIENNA
then
        kill $ZMIENNA
        sleep 2
        if kill -0 $ZMIENNA
        then
                kill -9 $ZMIENNA
        else
                exit 0
        fi
else
        echo "proces nie jest uruchomiony w tle"
        exit 0
fi
elif [ "status" = $1 ]
then
if kill -0 $ZMIENNA
then
        echo "proces uruchomiony w tle"
        exit 0
else
        echo "proces nie jest uruchomiony w tle"
        exit 0
fi
elif [ "restart" = $1 ]
then
if kill -0 $ZMIENNA
then
        echo "proces uruchomiony w tle wiec wylaczam i wlaczam na nowo"
        kill $ZMIENNA
        sleep 2
        if kill -0 $ZMIENNA
      then
                kill -9 $ZMIENNA
        fi
        nano proces &
        pidof nano > pidfile.txt

        exit 0
else
        echo "proces nie jest uruchomiony w tle wiec uruchamiam"
        nano proces &
        pidof nano > pidfile.txt

        exit 0
fi
else
echo "Blad! Jako parametr nalezy podac jedna z opcji: start,
stop, status, restart. W innym wypadku program nie będzie
dzialal."
fi
Proszę o pomoc

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3071
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Skrypt programu obsługującego proces w tle
« Odpowiedź #1 dnia: 2013-03-07, 18:45:38 »
1. A oświecisz mnie, jak edytor tekstu (nano) ma działać w tle? Jesteś telekinetykiem?
2. Zamiast sterty IFELSE'ów użyj CASE. Po to jest.
3. Niezależnie od tego, co podasz jako parametr, zawsze odpalają się 3 pierwsze polecenia.
4. Poczytaj o pseudozmiennych BASH o nazwach $#, $? itd. (w kontekście użycia pidof)
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

pigwabest

  • Gość
Skrypt programu obsługującego proces w tle
« Odpowiedź #2 dnia: 2013-03-07, 18:59:24 »
Zmieniłam na case. Nadal coś się wiesza. Czy w ogóle warunki if dobrze sprawdzają czy program jest uruchomiony? I wydaje mi się jakby proces wcale nie otwierał się w tle, dlaczego Chodzi mi o część:

if kill -0 $ZMIENNA
then
        echo "proces uruchomiony w tle"
Cały zmieniony trochę skrypt:

#!/bin/bash

ls -R / &
pidof ls > pidfile.txt
ZMIENNA=`cat pidfile.txt`

case "$1" in
"start")
if kill -0 $ZMIENNA
then
        echo "proces uruchomiony w tle"
        exit 1
else
        echo "uruchamiam proces"
        ls -R / &
        pidof ls > pidfile.txt
        ZMIENNA =`cat pidfile.txt`
        exit 1
fi
;;
"stop")
if kill -0 $ZMIENNA
then
        echo "prosze o zabicie proces"
        kill $ZMIENNA
        sleep 2
        if kill -0 $ZMIENNA
        then
                echo "ubijam proces"
                kill -9 $ZMIENNA
        else
                echo "proces zabity"
                exit 1
        fi
else
        echo "proces nie jest uruchomiony w tle"
        exit 1
fi
;;
"status")
if kill -0 $ZMIENNA
then
        echo "proces uruchomiony w tle"
        exit 1
else
        echo "proces nie jest uruchomiony w tle"
        exit 1
fi
;;
"restart")
if kill -0 $ZMIENNA
then
        echo "proces uruchomiony w tle wiec wylaczam i wlaczam na nowo"
        echo "prosze proces o zamkniecie"
        kill $ZMIENNA
        sleep 2
        if kill -0 $ZMIENNA
      then
                echo "ubijam proces"
                kill -9 $ZMIENNA
        fi
        echo "restartuje..."
        ls -R / &
        pidof ls > pidfile.txt
        ZMIENNA =`cat pidfile.txt`
        exit 1
else
        echo "proces nie jest uruchomiony w tle wiec uruchamiam"
        ls -R / &
        pidof ls > pidfile.txt
        ZMIENNA =`cat pidfile.txt`
        exit 1
fi
;;
*)
echo "Blad! Jako parametr nalezy podac jedna z opcji: start,
stop, status, restart. W innym wypadku program nie bedzie dzialal."
exit 1

esac

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Skrypt programu obsługującego proces w tle
« Odpowiedź #3 dnia: 2013-03-08, 07:56:38 »
Nie uruchamiaj edytora tekstu i skryptu w tym samym terminalu, bo albo Ci się nie uruchomi, albo zblokuje dostęp, albo staną się inne brzydkie rzeczy. Tego typu programy muszą mieć zwykle standardowe we/wy na wyłączność.

Uruchom go albo w osobnej konsoli albo użyj jakiejś komendy nieinteraktywnej, np "sleep", albo cokolwiek innego.

pigwabest

  • Gość
Skrypt programu obsługującego proces w tle
« Odpowiedź #4 dnia: 2013-03-08, 08:13:53 »
Cytat: vanhelzing
Nie uruchamiaj edytora tekstu i skryptu w tym samym terminalu, bo albo Ci się nie uruchomi, albo zblokuje dostęp, albo staną się inne brzydkie rzeczy. Tego typu programy muszą mieć zwykle standardowe we/wy na wyłączność.

Uruchom go albo w osobnej konsoli albo użyj jakiejś komendy nieinteraktywnej, np "sleep", albo cokolwiek innego.
Nie bardzo rozumiem. Co napisać w skrypcie aby uruchomił się w osobnej konsoli?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Skrypt programu obsługującego proces w tle
« Odpowiedź #5 dnia: 2013-03-08, 11:16:57 »
Uruchom drugi emulator terminalu, a w nim edytor, jeżeli już musi być to edytor tekstu.

Ewentualnie, możesz użyć jako przykładu sleepa:
sleep 120 &
Co uruchomi Ci sleepa na 120 sekund w tle, nic nie będzie robić, ale proces będzie uruchomiony i będziesz mógł się nim bezpiecznie bawić.

Dopóki tego nie zrobisz, to będą Ci się dziać różne dziwne rzeczy z konsolą.