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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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:
setsid python3 srypt.py &
plik logow jest uzupelniany w petli co ok. 2 sekundy,
wpisy maja postac:
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
Po pierwsze, jak już to
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
Jeżeli to ma być żywe zawsze i wiecznie to można albo studiować tydzień Systemd,
albo zainstalować paczuszki:
daemontools daemontools-run
stworzyć folder w /etc/service/USŁUGA/, w niej skrobnąć skrypta run, potem chmod 700 run i gotowe, np:
cat /etc/service/sshd/run
#!/bin/sh exec 2>&1 echo "*** Starting sshd..." exec \ /usr/sbin/sshd -D \ -e -f /etc/ssh/sshd_config
czy działa?
# root ~> svstat /etc/service/sshd /etc/service/sshd: up (pid 14736) 362090 seconds
Usługa działa?
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ć:
kill -9 20980 ; svstat /etc/service/sshd /etc/service/sshd: up (pid 14736) 362525 seconds
i co otrzymujemy:
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:
#!/bin/sh exec 2>&1 exec dropbear -F -R -E -s -a -p *:12531
czy openvpn:
#!/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
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:
|-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)
Offline
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ć:
[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?
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
[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
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
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
Time (s) | Query |
---|---|
0.00007 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00042 | 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='18.224.30.113' WHERE u.id=1 |
0.00082 | UPDATE punbb_online SET logged=1732192825 WHERE ident='18.224.30.113' |
0.00022 | SELECT * FROM punbb_online WHERE logged<1732192525 |
0.00065 | SELECT topic_id FROM punbb_posts WHERE id=322906 |
0.00082 | SELECT id FROM punbb_posts WHERE topic_id=30821 ORDER BY posted |
0.00028 | 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.00025 | SELECT search_for, replace_with FROM punbb_censoring |
0.00053 | 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.00098 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=30821 |
Total query time: 0.00509 s |