Mám aplikaci založenou na C++, kterou spouštím (spustitelný) jako démona s systemd.
Soubor jednotky:
[Unit]Description=Console ServiceAfter=network.target[Service]Environment="USER=ubuntu" "Cesta=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/binExecStart=/bin/ sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleSpustitelný soubor " #2> /dev/nullExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/nullRestart=on-failureRemainAfterExit=noTimeoutStopSec=10SuccessExitStatus=0 1TimeoutStartSec=360[Když vydám příkaz start, služba se spouští, ale poté okamžitě obdrží signál vypnutí a poté se ukončí.
Nějaké vodítko, co se děje?sudo systemctl status console.service● console.service - Console Service Načteno:načteno (/etc/systemd/system/console.service; povoleno; přednastaveno dodavatelem:povoleno) Aktivní:deaktivace (stop-sigterm) od Po 2017- 09-25 19:58:58 UTC; před 1s Proces:8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console. pid --retry=TERM/30/KILL/5 --oknodo --exec consoleSpustitelný soubor #2>/dev/null (kód=ukončeno, stav=0/ÚSPĚCH) Proces:8701 ExecStart=/bin/sh -ec exec / sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleSpustitelný soubor #2>/dev/null (code=ukončeno, stav=0/ÚSPĚCH) Hlavní PID:8701 (kód=ukončeno, stav=0/ÚSPĚCH) Úkoly:1 Paměť:1,8M CPU:53ms CGroup:/system.slice/console.service └─8705 consoleExecutableSep 25 19:58:58 mgmt1 systemd[1]:Started Console Service.sudo systemctl status console.service● console.service - Konzolová služba Načteno:načteno (/etc/systemd/system/console.service; povoleno; přednastaveno dodavatelem:povoleno) Aktivní:neaktivní (mrtvý) od Po 2017-09-25 19:59:01 UTC; před 947 ms Proces:8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console. pid --retry=TERM/30/KILL/5 --oknodo --exec consoleSpustitelný soubor #2>/dev/null (kód=ukončeno, stav=0/ÚSPĚCH) Proces:8701 ExecStart=/bin/sh -ec exec / sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleSpustitelný soubor #2>/dev/null (code=ukončeno, stav=0/ÚSPĚCH) Hlavní PID:8701 (kód=opuštěno, stav=0/ÚSPĚCH) 25. září 19:58:58 mgmt1 systemd[1]:Spuštěna služba konzoly.Přijatá odpověď:
Environment="USER=ubuntu" "Cesta=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/binExecStart=/bin/sh -ec "exec /sbin/start-stop -daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleSpustitelný soubor " #2>/dev/nullExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/nullTo je téměř hodné systemd House of Horror. Nebýt toho, že už existuje hororový příběh, který to dělá.
Nepoužívejte
start-stop-daemon
v servisní jednotce dělat všechny věci, které servisní jednotka již dělá . S nepotřebnými soubory PID a nesprávným předpokladem, žeExecStart
přijímá komentáře k syntaxi shellu, ne méně.A nedělejte to, co říká druhá odpověď, a snažte se to odrazit pomocí
Type=forking
. To vše zhoršuje, nikoli zlepšuje.Nesmysl s
Související:Okna Compiz + MATE skočí na předchozí pracovní plochu?start-stop-daemon
proto se věci nedaří. Protože proces běžístart-stop-daemon
nestane služba, ale ve skutečnosti končí téměř okamžitě, systemd si myslí, že vaše služba končí. Ve vašem prvnímsystemctl status
výstup, můžete vidět, že systemd je uprostřed odesíláníSIGTERM
k vyčištění všech zbývajících běžících procesů po spuštěníExecStop
akci, což je to, co dělá, když si myslí, že služba byla ukončena.Dělejte věci jednoduše:
Typ=simpleWorkingDirectory=/home/ubuntu/console/binUser=ubuntuExecStart=/home/ubuntu/console/bin/consoleExecutableŽádný
ExecStop
aniEnvironment
je ve skutečnosti vyžadováno.Další čtení
- Jonathan de Boyne Pollard (2015). Opravdu nemusíte démonizovat. Opravdu. . Systemd House of Horror.
- Jonathan de Boyne Pollard (2016). Pokud máte dvě služby, definujte dvě služby. . Systemd House of Horror.
- Jonathan de Boyne Pollard (2015). Problémy s protokolem připravenosti u unixových démonů . Často uváděné odpovědi.
- Systemd ukončí službu ihned po spuštění
Použít rozšíření .sh nebo .bash pro skripty Bash? Linux:Jak získat všechny přihlašovací protokoly ze systému?Linux