Tento kód používám k démonizaci svých aplikací. Umožňuje vám start/stop/restart
skript pomocí následujících příkazů.
python myscript.py start
python myscript.py stop
python myscript.py restart
Kromě toho mám také skript init.d pro ovládání mé služby. To vám umožní automaticky spustit službu při spuštění operačního systému.
Zde je jednoduchý příklad, který vám pomůže. Jednoduše přesuňte svůj kód do třídy a zavolejte jej z run
funkce uvnitř MyDeamon
.
import sys
import time
from daemon import Daemon
class YourCode(object):
def run(self):
while True:
time.sleep(1)
class MyDaemon(Daemon):
def run(self):
# Or simply merge your code with MyDaemon.
your_code = YourCode()
your_code.run()
if __name__ == "__main__":
daemon = MyDaemon('/tmp/daemon-example.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
Počáteční
Pokud používáte operační systém, který používá Upstart (např. CentOS 6) – můžete službu Upstart spravovat také. Pokud používáte Upstart, můžete ponechat svůj skript tak, jak je, a jednoduše přidat něco takového pod /etc/init/my-service.conf
start on started sshd
stop on runlevel [!2345]
exec /usr/bin/python /opt/my_service.py
respawn
Ke správě služby pak můžete použít start/stop/restart.
např.
start my-service
stop my-service
restart my-service
Podrobnější příklad práce s upstart je k dispozici zde.
Systemd
Pokud používáte operační systém, který používá Systemd (např. CentOS 7), můžete se podívat na následující odpověď Stackoverflow.
Nabízím dvě doporučení:
dozorce
1) Nainstalujte supervisor
balíček (podrobnější pokyny zde):
sudo apt-get install supervisor
2) Vytvořte konfigurační soubor pro svého démona na /etc/supervisor/conf.d/flashpolicyd.conf
:
[program:flashpolicyd]
directory=/path/to/project/root
environment=ENV_VARIABLE=example,OTHER_ENV_VARIABLE=example2
command=python flashpolicyd.py
autostart=true
autorestart=true
3) Restartujte supervisor
k načtení nového .conf
supervisorctl update
supervisorctl restart flashpolicyd
systemd (pokud ho aktuálně používá vaše distribuce Linuxu)
[Unit]
Description=My Python daemon
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/project/main.py
WorkingDirectory=/opt/project/
Environment=API_KEY=123456789
Environment=API_PASS=password
Restart=always
RestartSec=2
[Install]
WantedBy=sysinit.target
Umístěte tento soubor do /etc/systemd/system/my_daemon.service
a povolte jej pomocí systemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block
.
Zobrazení protokolů:
systemctl status my_daemon