Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Plik .sh uruchomiony poprzez daemon  (Przeczytany 6907 razy)

kapio

  • Gość
Plik .sh uruchomiony poprzez daemon
« dnia: 2013-12-15, 20:16:38 »
Chce stworzyć skrypt i uruchomić go poprzez program daemon (aby jego zawartość cały czas było odtwarzana). I tutaj mam problem mam taki skrypt (testowy):
#!/bin/bash
echo "Hello world" > /home/xx.log
odpalam go daemonem:
daemon -u root.root -n example -O /home/xx.log -E /home/xx.err --pidfile /home/xx.pid /root/xx.sh
i ok skrypt się uruchamia, widać go w procesach, nie znika, ale problem jest taki, że skrypt wykona się 5 razy i koniec. Cały czas siedzi w procesach, ale już się nie wykonuje. Próbowałem tam dopisać sleep, ale to też nie skutkuje. I teraz pytanie da się to zrobić, aby skrypt cały czas był wykonywany?

Editos: OK, udało mi się wbiłem to w pętle while
while true ; do 
{funkcja}
sleep 5
done

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Plik .sh uruchomiony poprzez daemon
« Odpowiedź #1 dnia: 2013-12-16, 10:48:13 »
Sprawa jest jasna:

1. Serwer (jako ogólny program) ma za zadanie działać ciągle.
2. Jeżeli serwer się sam z siebie kończy, to zakłada się,  że nawalił.
3. Konkretny program 'daemon' uruchamia drugi program (serwer) i nadzoruje go. Jeżeli serwer padnie, to program demon go uruchamia ponownie. Jeżeli program padnie kilka razy w ciągu sekundy (standard to 5), to program daemon zakłada poważniejszą awarię i zaprzestaje restartów na jakiś czas.

4. Ty w pierwszej wersji zrobiłeś serwer, który robi jedną rzecz i się wyłącza. To nie jest serwer i dlatego program daemon zgłupiał.
5. Drugi program działa ciągle, więc jest poprawnie nadzorowany.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

kapio

  • Gość
Plik .sh uruchomiony poprzez daemon
« Odpowiedź #2 dnia: 2013-12-16, 16:10:52 »
Dzięki Ci za wyjaśnienie :) Czyli sam daemon nic nie robi. Działa na podobnej zasadzie jak screen/nohup tak? Uruchamia nasz plik i trzyma go przy życiu (a skrypt wykonuje dane polecenia)?

Editos: Czyli 'serwerem' możemy nazwać 2 skrypt (polecenie które zostało wrzucone w pętle while)? Ponieważ po uruchomieniu działa ciągle tak?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Plik .sh uruchomiony poprzez daemon
« Odpowiedź #3 dnia: 2013-12-16, 18:15:30 »
Tak. Różnica do screen/nohup jest taka,  że daemon wykrywa śmierć monitorowanego procesu i go ponownie uruchamia.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

kapio

  • Gość
Plik .sh uruchomiony poprzez daemon
« Odpowiedź #4 dnia: 2013-12-16, 22:58:41 »
A w takim wypadku jest możliwość napisania tego inaczej czy jedyne wyjście to pętla?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Plik .sh uruchomiony poprzez daemon
« Odpowiedź #5 dnia: 2013-12-16, 23:38:25 »
Nie ma niczego złego w pętli. Wszystkie działające dłużej programy niewykonujące ciągłych obliczeń są na nich oparte. Wystarczy spojrzeć chociażby na koncepcję event loop czy idle loop.

Warto by jednak zadbać, aby pętla nie wykonywała się ciągle niepotrzebnie zużywając 100% CPU i ciągle testując jakieś warunki. Można dodać proste opóźnienie (sleep), a najlepiej blokujące pułapki czekające na jakieś zdarzenie, np zakończenie innego procesu (polecenie wait), standardowe wejście (polecenie read), połączenie z sieci (choćby netcat/nc), czy jakiekolwiek inne obsługiwalne zdarzenie. Wszystko zależy od tego co twój serwer ma robić.