GNU/Linux >> Znalost Linux >  >> Linux

Proč Systemd zastavuje službu ihned po jejím spuštění?

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/null

To 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, že ExecStart 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 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ím systemctl 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.

Související:Okna Compiz + MATE skočí na předchozí pracovní plochu?

Dělejte věci jednoduše:

Typ=simpleWorkingDirectory=/home/ubuntu/console/binUser=ubuntuExecStart=/home/ubuntu/console/bin/consoleExecutable

Žádný ExecStop ani Environment 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í

Linux
  1. 10 praktických příkazů systemd:Reference

  2. Jak vytvořit službu Systemd v Linuxu

  3. Přidání nové služby do Linux systemd

  1. Způsobit spuštění skriptu po spuštění sítě?

  2. Centos – Systemd ukončí službu ihned po spuštění?

  3. Spustit službu Systemd po automatickém připojení, ale poté, co k ní přistoupíte?

  1. Proč většina příkladů Systemd obsahuje Wantedby=multi-user.target?

  2. Služba MongoDB se po počátečním nastavení nespustí

  3. systemd:SIGTERM ihned po startu