Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2019-02-02 03:36:11

  dzmderr - Nowy użytkownik

dzmderr
Nowy użytkownik
Zarejestrowany: 2019-01-31

Jak zrealizowac watchdoga w Debianie ?

Mam pewien skrypt pythonowy, ktory powinien dzialac w tle caly czas, jednak z jakiegos powodu czasem zawiesza sie po kilkunastu / kilkudziesieciu godzinach pracy.

Nadal jest widoczny na liscie procesow, ale wiem, ze nie dziala, bo plik logow nie jest uzupelniany.

skrypt jest uruchamiany w konsoli po ssh w taki sposob:

Kod:

setsid python3 srypt.py &

plik logow jest uzupelniany w petli co ok. 2 sekundy,
wpisy maja postac:

Kod:

timestamp:komunikat

Istnieje jakis prosty sposob na zrealizowanie w debianie watchdoga, ktory bedzie monitorowal prace tego skryptu i ewentualnie go restartowal w przypadku zatrzymania pracy ?

Chodzi o to, ze jesli np. przez 10 / 20 sekund plik log nie jest uzupelnany to proces w ktorym otwarty jest ten plik zostaje zrestartowany.

Jak najlatwiej cos takiego osiagnac ?

Offline

 

#2  2019-02-02 04:48:28

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zrealizowac watchdoga w Debianie ?

Po pierwsze, jak już to

Kod:

setsid -f python3 srypt.py

Po drugie, jak używasz systemd, to zrób sobie usługę uruchamiającą ten skrypt, w szczególności popatrz sobie na Restart= i SuccessExitStatus= jeśli masz niestandardowe sygnały wyjścia. Jest jeszcze cała masa opcji, które można ustawić, więc sobie przeczytaj:

https://www.freedesktop.org/software/systemd/man/systemd.service.html

A po trzecie, jak będziesz miał usługę systemd, to nie używaj setsid .

Ostatnio edytowany przez morfik (2019-02-02 04:48:52)

Offline

 

#3  2019-02-02 07:50:38

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Jak zrealizowac watchdoga w Debianie ?

Jeżeli to ma być żywe zawsze i wiecznie to można albo studiować tydzień Systemd,
albo zainstalować paczuszki:

Kod:

daemontools
daemontools-run

stworzyć folder w /etc/service/USŁUGA/, w niej skrobnąć skrypta run, potem chmod 700 run i gotowe, np:

Kod:

cat /etc/service/sshd/run

Kod:

#!/bin/sh

exec 2>&1
echo "*** Starting sshd..."
exec \
    /usr/sbin/sshd -D \
    -e -f /etc/ssh/sshd_config

czy działa?

Kod:

# root ~> svstat /etc/service/sshd
/etc/service/sshd: up (pid 14736) 362090 seconds

Usługa działa?

Kod:

root      2075  0.0  0.0   4052   644 ?        S    Jan29   0:00 supervise sshd
root     20980  0.0  0.2  65776  5492 ?        S    07:37   0:00 /usr/sbin/sshd -D -e -f /etc/ssh/sshd_config

Spróbujmy ją ubić:

Kod:

kill -9 20980 ; svstat /etc/service/sshd
/etc/service/sshd: up (pid 14736) 362525 seconds

i co otrzymujemy:

Kod:

root      2075  0.0  0.0   4052   644 ?        S    Jan29   0:00 supervise sshd
root     20992  0.0  0.2  65776  5504 ?        S    07:40   0:00 /usr/sbin/sshd -D -e -f /etc/ssh/sshd_config

Pid demona sshd zmienił się 20980 na 20992, ale usługa po crashu została podniesiona w ciągu sekundy i działa dalej.

Warunek poprawnego działania programu uruchamianego przez daemontools jest taki, że program nie może uciekać w tło, w tryb demona, musi być uruchomiony w trybie konsoli.
Prawie wszystkie demony sieciowe to potrafią, np serwer sshd dropbear:

Kod:

#!/bin/sh
exec 2>&1
exec dropbear -F -R -E -s -a -p *:12531

czy openvpn:

Kod:

#!/bin/sh

exec 2>&1

mkfifo /dev/openvpn || true
chown openvpn:openvpn /dev/openvpn
chmod 644 /dev/openvpn
echo "*** Starting OpenVPN..."

exec  openvpn --config /etc/openvpn/serwer.conf  --log /dev/openvpn

Kod:

svstat /etc/service/{openvpn,dropbear,sshd}
/etc/service/openvpn: up (pid 28356) 187217 seconds
/etc/service/dropbear: up (pid 2094) 371838 seconds
/etc/service/sshd: up (pid 14736) 363037 seconds

Cale drzewko procesów daemontoolsa:

Kod:

 |-svscanboot---svscan-+-supervise---dropbear---dropbear---bash---pstree
        |                     |-supervise---dovecot-+-anvil
        |                     |                     |-auth
        |                     |                     |-config
        |                     |                     |-imap-login
        |                     |                     |-log
        |                     |                     |-managesieve-log
        |                     |                     |-pop3-login
        |                     |                     `-ssl-params
        |                     |-supervise---cron
        |                     |-supervise---master-+-oqmgr
        |                     |                    |-pickup
        |                     |                    `-tlsmgr
        |                     |-supervise---sshd
        |                     |-supervise---spamd---2*[spamd child]
        |                     |-supervise---mysqld---32*[{mysqld}]
        |                     |-supervise---run---lua5.1---lua5.1
        |                     |-supervise---nginx---2*[nginx]
        |                     |-supervise---run---rsyslogd-+-{in:imklog}
        |                     |                            |-{in:imuxsock}
        |                     |                            `-{rs:main Q:Reg}
        |                     |-supervise---php-fpm7.0---4*[php-fpm7.0]
        |                     |-supervise---run---cgrulesengd
        |                     |-supervise---postgrey --pidf
        |                     |-supervise---dovecot-+-anvil
        |                     |                     |-auth
        |                     |                     |-config
        |                     |                     |-imap-login
        |                     |                     |-log
        |                     |                     |-managesieve-log
        |                     |                     `-ssl-params
        |                     |-supervise
        |                     `-supervise---openvpn

Pozdro

Ostatnio edytowany przez Jacekalex (2019-02-02 07:53:59)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#4  2019-02-02 09:10:57

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zrealizowac watchdoga w Debianie ?

Eeee, ale usługa systemd ma domyślnie już skonfigurowanego watchdoga i nic nawet nie trzeba dodawać do pliku usługi.  W zasadzie dla większość ludzi ta standardowa konfiguracja bez problemu znajdzie zastosowanie OOTB. Jeśli jednak ktoś robi coś w niestandardowy sposób, to przydałoby się przeczytać manual, by ustalić jakie parametry jeszcze mogłyby znaleźć zastosowanie w konkretnym przypadku.

Przykład, najprostsza usługa jaką można zrobić:

Kod:

[Unit]
Description=test

[Service]
ExecStart=/bin/false
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target

I co się stanie jak taka usługa zwróci błąd?

Kod:

Feb 02 09:01:44 morfikownia systemd[1]: Started test.
Feb 02 09:01:44 morfikownia systemd[1]: test-false.service: Main process exited, code=exited, status=1/FAILURE
Feb 02 09:01:44 morfikownia systemd[1]: test-false.service: Failed with result 'exit-code'.

Feb 02 09:01:45 morfikownia systemd[1]: test-false.service: Service RestartSec=1s expired, scheduling restart.
Feb 02 09:01:45 morfikownia systemd[1]: test-false.service: Scheduled restart job, restart counter is at 1.
Feb 02 09:01:45 morfikownia systemd[1]: Stopped test.
Feb 02 09:01:45 morfikownia systemd[1]: Started test.
Feb 02 09:01:45 morfikownia systemd[1]: test-false.service: Main process exited, code=exited, status=1/FAILURE
Feb 02 09:01:45 morfikownia systemd[1]: test-false.service: Failed with result 'exit-code'.

Feb 02 09:01:47 morfikownia systemd[1]: test-false.service: Service RestartSec=1s expired, scheduling restart.
Feb 02 09:01:47 morfikownia systemd[1]: test-false.service: Scheduled restart job, restart counter is at 2.
Feb 02 09:01:47 morfikownia systemd[1]: Stopped test.
Feb 02 09:01:47 morfikownia systemd[1]: Started test.
Feb 02 09:01:47 morfikownia systemd[1]: test-false.service: Main process exited, code=exited, status=1/FAILURE
Feb 02 09:01:47 morfikownia systemd[1]: test-false.service: Failed with result 'exit-code'.

Feb 02 09:01:48 morfikownia systemd[1]: test-false.service: Service RestartSec=1s expired, scheduling restart.
Feb 02 09:01:48 morfikownia systemd[1]: test-false.service: Scheduled restart job, restart counter is at 3.
Feb 02 09:01:48 morfikownia systemd[1]: Stopped test.
Feb 02 09:01:48 morfikownia systemd[1]: test-false.service: Start request repeated too quickly.
Feb 02 09:01:48 morfikownia systemd[1]: test-false.service: Failed with result 'exit-code'.
Feb 02 09:01:48 morfikownia systemd[1]: Failed to start test.

Widać, że to co było w ExecStart zwróciło błąd (bez znaczenia czy na starcie czy w trakcie), no i systemd wykrył to, i przystąpił do restartu usługi. W tym przypadku akurat domyślnie jest 3 razy co 1s ale można sobie skonfigurować by próbował w nieskończoność nawet i chyba co 1ms.

Także sam widzisz, że ten ficzer watchdoga już jest wbudowany w systemd (i to od lat) i nie trzeba sobie nawet głowy zawracać dodatkowymi narzędziami i ich konfiguracją -- to ma robić menadżer procesów, jakim jest systemd, a nie jeszcze się bawić w dodatkowe programiki. xD

Offline

 

#5  2019-02-02 14:00:23

  dzmderr - Nowy użytkownik

dzmderr
Nowy użytkownik
Zarejestrowany: 2019-01-31

Re: Jak zrealizowac watchdoga w Debianie ?

[quote=morfik]Widać, że to co było w ExecStart zwróciło błąd (bez znaczenia czy na starcie czy w trakcie), no i systemd wykrył to, i przystąpił do restartu usługi. W tym przypadku akurat domyślnie jest 3 razy co 1s ale można sobie skonfigurować by próbował w nieskończoność nawet i chyba co 1ms.[/quote]
Obawiam się że w moim wypadku tryb "on-failure" nie zadziała, bo skrypt nie
znika nawet z listy procesow gdy sie zawiesi.

Da się moze tak skonfigurować watchdoga żeby monitorował plik z logiem i restartował usługe wtedy gdy
w pliku nie pojawiają się nowe wpisy przez określony czas ?

Offline

 

#6  2019-02-02 14:52:19

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zrealizowac watchdoga w Debianie ?

Na zawieszone procesy to trzeba WatchdogSec= ustawić sobie. Wtedy co określoną ilość czasu wysyłany jest ping do procesu i jak proces zawiesza się, to przestaje odpowiadać na ping i wtedy systemd może go zresetować.

Offline

 

#7  2019-02-04 02:19:26

  091619EE - Użytkownik

091619EE
Użytkownik
Zarejestrowany: 2018-07-09

Re: Jak zrealizowac watchdoga w Debianie ?

w pythonie jest paczka [b]systemd[/b]:

https://pypi.org/project/systemd/

notyfikacja u watchdoga:

[b]from systemd.daemon import notify, Notification[/b]
from random import randint
import requests
import time
import sys
import os

log = open('/var/log.txt','w')

def logger(message):
    log.write('%10d: %s \n'%(int(time.time()),message))
    log.flush()

logger('restart...')

while True:
    try:
        logger("ip: "+requests.get('ifconfig.co/ip').text)
       
        [b]if randint(0,99) == 0: #ZWIECHA !!!
            while True:
                time.sleep(1)[/b]
       
        time.sleep(1)
        [b]notify(Notification.WATCHDOG)[/b]

    except KeyboardInterrupt:
        raise
    except:
        exc_info = sys.exc_info()
        logger("Unexpected error: %s" % exc_info[0])
        logger("value: %s" % exc_info[1])
        logger("traceback: %s" % exc_info[2])[/quote]

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.009 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00014 SET CHARSET latin2
0.00005 SET NAMES latin2
0.00100 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.137.175.80' WHERE u.id=1
0.00063 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.137.175.80', 1732210728)
0.00038 SELECT * FROM punbb_online WHERE logged<1732210428
0.00042 SELECT topic_id FROM punbb_posts WHERE id=322827
0.00127 SELECT id FROM punbb_posts WHERE topic_id=30821 ORDER BY posted
0.00058 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=30821 AND t.moved_to IS NULL
0.00006 SELECT search_for, replace_with FROM punbb_censoring
0.00116 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=30821 ORDER BY p.id LIMIT 0,25
0.00090 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=30821
Total query time: 0.00659 s