python-daemon

48 views
Skip to first unread message

Jachym Cepicky

unread,
Oct 19, 2019, 1:34:30 AM10/19/19
to djan...@googlegroups.com
Ahoj všem,

potřeboval bych napsat v Pythonu démona - proces běžící na pozadí,
který po zbytek svého životního cyklu tiše sedí v systému a dělá co
má.

Možnosti jsou od prostého

mujdaemon.py &

až po sofistikovanější python-daemon

python-daemon má ten problém, že dokumentace k tomu moc není, postrádá
to metody stop, restart, ... nebo aspoň návod jak si je udělat a vůbec
si nejsem jistej, že pidfile funguje tak, jak bych čekal (např. že mě
nenechá pustit dva daemony najednou)

máte s tím někdo zkušenosti? nějakej funkční příklad?

Dík

J

--
Jachym Cepicky
e-mail: jachym.cepicky gmail com
URL: http://les-ejk.cz
GPG: http://les-ejk.cz/pgp/JachymCepicky.pgp

starenka .

unread,
Oct 19, 2019, 2:41:24 AM10/19/19
to djan...@googlegroups.com
supervisor?

---
aknerats[::-1]

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAAZUH4GDjxoO_ezPW%2B%3DJuAemzu3wTCMJ64iDNjGvRWYLaGMA%2Bg%40mail.gmail.com.

Petr Messner

unread,
Oct 19, 2019, 4:32:09 AM10/19/19
to djan...@googlegroups.com
Dneska mají všechny rozumné distribuce systemd. Jediné, co potřebuješ, je napsat Python program, který něco dělá, a ideálně umí korektně reagovat na SIGTERM. Ani fork nebo double fork už nemusíš dělat, to za tebe řeší systemd. A pak ještě vytvoříš systemd unit file a pak už jen systemctl start :)

Pokud bys šel do Dockeru, tak je postup stejný - jen místo systemd unit file napíšeš Dockerfile.

Petr Messner

> 19. 10. 2019 v 7:34, Jachym Cepicky <jachym....@gmail.com>:
>
> Ahoj všem,

Jan Walter

unread,
Oct 19, 2019, 5:23:04 AM10/19/19
to djan...@googlegroups.com
Ad docker: jakou používáte techniku pro nahození kontejnerů po (re)startu docker služby, resp. pádu kontejneru? My jsme si oblíbili docker compose s restart: unless-stopped.

Dík za případnou inspiraci.

Petr Messner

unread,
Oct 19, 2019, 5:45:39 AM10/19/19
to djan...@googlegroups.com
Ten restart umí udělat samotný docker - stačí kontejner spustit přes docker run --restart always :) (Mozna stačí -r?) Viz dokumentaci: https://docs.docker.com/engine/reference/run/#restart-policies---restart

Docker compose se mi nelíbí, dělá to spoustu blbostí navíc. Docker lze ovládat z cfgmgmt systémů typu Ansible, Salt apod., ale tam se mi taky nějaké detaily nelíbily :) Takže mám vlastní skript v Pythonu, který celkem jednoduchým způsobem managuje kontejnery na daném stroji podle yaml předpisu (takže stejná myšlenka jako compose, jen par detailů jinak). Docker má pro Python přímo oficiální modul, ale neni problém skriptovat i okolo docker cli příkazu (přepnout si jeho výstup do json a tak). 

Petr Messner

19. 10. 2019 v 11:23, Jan Walter <jnw...@gmail.com>:



Jan Walter

unread,
Oct 19, 2019, 6:11:16 AM10/19/19
to djan...@googlegroups.com
Jasne, to Tvoje spusteni s parametrem je, myslim, efektivne totez, jako to mit napsany v yml pro docker compose jak to mame my. Mne se na nem naopak libi, ze mas prehledne na 1 miste nadefinovanej celej ekosystem kontejneru vs. sdilenych siti, ulozist, muzes mit i fragmenty definovany ve vice souborech a ty pak skladat/pretezovat pro ruzna prostredi.

Uplne bez chyb ten design neni, ale nasli jsme si zpusob, zije nam to s ansiblem (asi to teda spoustime trochu rucne, nikoli dedikovanym modulem), mozna mi neco uniklo, ale vlastne nevim, kde je zasadni rozdil mezi sadou docker runs s vhodnyma parametrama a docker compose.

Petr Messner

unread,
Oct 19, 2019, 6:44:30 AM10/19/19
to djan...@googlegroups.com

> 19. 10. 2019 v 12:11, Jan Walter <jnw...@gmail.com>:
>
> celej ekosystem kontejneru vs. sdilenych siti, ulozist,

Řešíte sdílené sítě/úložiště i nějak napříč fyzickými servery (docker hosty)?

Petr Messner

Jachym Cepicky

unread,
Oct 19, 2019, 7:03:46 AM10/19/19
to djan...@googlegroups.com
To je vlastně dobrej nápad, nechat to prostě v shellu a přihodit

* Dockerfile pro ty, co to chtějí dělat dockerem
* systemd unit file - tohle šlo trochu kolem mě (naposledy jsem
editoval rc skripty), ale zdá se, že jsem schopnej to pochopit

tak jo, kašlu na python-daemon,

dík

J

so 19. 10. 2019 v 12:44 odesílatel Petr Messner <petr.m...@gmail.com> napsal:
> --
> --
> E-mailová skupina djan...@googlegroups.com
> Správa: http://groups.google.cz/group/django-cs
> ---
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
> Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/ECEC6CD0-7E43-4F4D-A8C3-E69996A4CF02%40gmail.com.

Jan Walter

unread,
Oct 19, 2019, 7:39:34 AM10/19/19
to djan...@googlegroups.com
Myslíš aby byly kontejnery na různých hostech v jedné síti? To ne. Nejsem síťař, nemám tušení, jak by se to dělalo. Má na to docker nějaké prostředky? Nebo vpn?

Úložiště si umím představit líp, ale teď si nevybavuju, že bychom to někde dělali.

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.

Vláďa Macek

unread,
Oct 19, 2019, 4:23:21 PM10/19/19
to djan...@googlegroups.com

I když bych nesouhlasil s případnou implikací mezi výroky "distribuce je rozumná" a "má systemd" v ani jednom směru, tak když už mi tam systemd smrdí, používám ho na řízení Django-based app serverů.

Pro zájemce unita, configy a manage (kombinovaný pro wsgi entry point i mgmt, citlivé settingy zcela mimo src/), ke kterým jsem došel:

$ cat /etc/systemd/system/myproject.service
# See man systemd.exec(5) for help.

[Unit]
Description=MyProject service
After=network.target

[Service]
PIDFile=/home/myproject/var/run/gunicorn.pid
User=myproject
Group=share
UMask=0000

WorkingDirectory=/

# /home/myproject is a virtualenv, so no need to setup the paths.

ExecStart=/home/myproject/bin/gunicorn myproject.manage --config python:myproject.settings.gunicorn
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

PrivateTmp=false
ProtectHome=false

[Install]
WantedBy=multi-user.target

$ cat /home/myproject/src/myproject/myproject/settings/gunicorn.py
import os

VAR_DIR = '/home/myproject/var'

# http://docs.gunicorn.org/en/latest/settings.html#settings

proc_name = 'myproject'

workers = 8
threads = 1
max_requests = 500
max_requests_jitter = 50

pidfile = os.path.join(VAR_DIR, 'run', 'gunicorn.pid')
bind = 'unix:' + os.path.join(VAR_DIR, 'run', 'gunicorn.sock')

accesslog = os.path.join(VAR_DIR, 'log', 'gunicorn-access.log')
errorlog = os.path.join(VAR_DIR, 'log', 'gunicorn-error.log')
capture_output = True

$ cat /home/myproject/src/myproject/myproject/manage.py
#!/usr/bin/env python
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject_local_settings')

try:
    if __name__ == '__main__':
        import sys

        from django.core.management import execute_from_command_line

        execute_from_command_line(sys.argv)

    else:
        from django.core.wsgi import get_wsgi_application

        application = get_wsgi_application()

except ImportError as exc:
    raise ImportError(
        "Couldn't import Django. Are you sure it's installed and "
        "available on your PYTHONPATH environment variable? Did you "
        "forget to activate a virtual environment?"
    ) from exc

$ cat /home/myproject/lib/python3.4/site-packages/myproject_local_settings.py
from myproject.settings.production import *

SECRET_KEY = '...'

DATABASES['default']['PASSWORD'] = '...'


Jachym Cepicky

unread,
Oct 21, 2019, 6:21:03 AM10/21/19
to djan...@googlegroups.com
olala!

so 19. 10. 2019 v 22:23 odesílatel Vláďa Macek <ma...@sandbox.cz> napsal:
> --
> --
> E-mailová skupina djan...@googlegroups.com
> Správa: http://groups.google.cz/group/django-cs
> ---
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
> Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/007d8fd2-cf92-3c6c-e9b0-b31bed3a6d80%40sandbox.cz.

starenka .

unread,
Oct 21, 2019, 6:25:35 AM10/21/19
to djan...@googlegroups.com
a co je spatnyho na tom supervisoru? pride mi to takovej jakoze dost standard...
---
In Perl you shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you. | print 'aknerats'[::-1]


Petr Messner

unread,
Oct 21, 2019, 7:58:50 AM10/21/19
to djan...@googlegroups.com
Mě dneska jako standard přijde právě systemd :) Teoreticky by ho měl znát každý sysadmin nebo i power user. 

po 21. 10. 2019 v 12:25 odesílatel starenka . <star...@gmail.com> napsal:

Vláďa Macek

unread,
Oct 21, 2019, 9:28:06 AM10/21/19
to djan...@googlegroups.com
On 21. 10. 19 12:24, starenka . wrote:
> a co je spatnyho na tom supervisoru? pride mi to takovej jakoze dost
> standard...


Za me kazda zavislost, ktera neexistuje, je dobra zavislost.

Vyhovuje mi, ze mi systemd pusti pure Python app server, kterej je soucasti
virtualenvu, tj. napriklad zadny dodefinovavani cest, jeden homgenni celek.

Vse je pekne po kupe, strukturalne moje venvy pripominaji
https://cs.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

Uz jsem takovej, mam toho radsi na starost min. :-)

V.

starenka .

unread,
Oct 21, 2019, 12:08:51 PM10/21/19
to djan...@googlegroups.com
jasny, chapu. 

---
In Perl you shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you. | print 'aknerats'[::-1]

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages