Vraag Hoe laat ik mijn systemd-service draaien via een specifieke gebruiker en begin ik met opstarten?


Ik heb zojuist een upgrade uitgevoerd van Ubuntu-server 14 naar versie 15. Ik had moeite om mijn upstart-script na de upgrade te laten werken en las dat systemd de nieuwe standaard is. Ik ben verre van een Linux-expert, dus doe alsjeblieft rustig aan met me :-)

Dit is wat mijn upstart-script eerder was:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

Gebaseerd op de parate tot systemd wiki-pagina, Ik gebruikte de tabellen die daar zijn gegeven om de dingen zo goed mogelijk in kaart te brengen in mijn nieuwe systemd-servicebestand:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

Dit bestand bevindt zich op /home/robert/.config/systemd/user/nzbget.service. Om de service handmatig te starten, heb ik gedaan:

$ systemctl --user start nzbget

Dit werkt geweldig. Wanneer ik me echter afmeld bij mijn SSH-sessie, wordt de service afgesloten. Het start ook niet bij het opstarten of inloggen van gebruikers. Ik wil dat het hetzelfde gedrag vertoont als een upstart-service: ik wil dat het start bij het opstarten, constant wordt uitgevoerd en als een specifieke gebruiker.

Wat moet ik doen om deze configuratie te krijgen?


85
2017-09-19 16:17


oorsprong




antwoorden:


Eerste probleem

U kunt de richtlijnen opgeven User= en Group= in de [Service] sectie van het unitbestand.

Tweede probleem

Als u de service bij het opstarten wilt laten uitvoeren, moet u deze niet in uw thuismap plaatsen. Plaats het in plaats daarvan /etc/systemd/system/. Dit is de map die moet worden gebruikt door de systeembeheerder (dat wil zeggen u) om nieuwe systeembrede services toe te voegen.

Andere mappen zijn:

  • /usr/lib/systemd/system/ is bedoeld voor pakketten die eenheidsbestanden willen installeren, hoewel onder Debian en Ubuntu de map feitelijk is /lib/systemd/system/ omdat de verschillende bin en lib mappen zijn niet samengevoegd in een uniform /usr/ voorvoegsel.
  • /usr/local/systemd/system/ is voor het installeren van eenheden door lokaal samengestelde pakketten.

Het testen van het apparaat

Als het eenheidsbestand zich op een geschikte locatie bevindt, kunt u proberen het apparaat onmiddellijk te starten door te typen systemctl start <UNIT_FILENAME> zoals gewoonlijk. Het zou moeten werken zonder het volledige pad van het apparaat te hoeven typen. De extensie hoeft ook niet te worden opgegeven als dat zo is .service.

Het apparaat inschakelen

Voordat u uw eenheid kunt inschakelen, moet u een [Install] sectie, waaronder u de richtlijn moet toevoegen WantedBy=multi-user.target. Deze richtlijn specificeert de fase van het opstartproces waarin de service zou moeten worden gestart (als deze was ingeschakeld). multi-user.target is geschikt voor de meeste diensten.

Zodra die informatie is toegevoegd, kunt u gebruiken systemctl enable <UNIT_FILENAME>, waardoor het systeem wordt ingeschakeld en vanaf nu automatisch wordt gestart tijdens het opstarten in de opgegeven fase.


102
2017-09-19 16:51



Dit werkte. Ik moest het absolute pad naar de servicebestandsnaam opgeven in de systemctl enableMaar dit was in het begin voor mij niet vanzelfsprekend. Ook inschakelen gaf me enige waarschuwing over een vermissing [Install] sectie. Ik negeerde het, maar ik weet niet zeker of dit van invloed is op het vermogen om te starten tijdens het opstarten. - void.pointer
De Install waarschuwing was eigenlijk heel belangrijk. Het start niet bij opstarten zonder WantedBy=multi-user.target onder de [Install] sectie. Na het toevoegen van dit aan de .service het dossier, dan jij kan enable het. - void.pointer
Het spijt me dat ik het antwoord zo lang onbeheerd achter heb gelaten. Ik repareerde de locatie waar het unit-bestand moest komen, voegde de ontbrekende informatie toe over de [Install] sectie. Ik hoop dat het nu meer nuttig is voor iedereen die ernaar op zoek is. - Yamaho
Dit wordt veel gemakkelijker wanneer de gebruikersnaam sjabloon is, dat wil zeggen dat uw service is gedefinieerd met een bestandsnaam in het formaat something@.service dan enableik zou willen something@username.service de instelling wordt User=%i wat betekent dat de gebruiker niet hard-gecodeerd is en dat meerdere gebruikers dezelfde definitie kunnen gebruiken. Een voorbeeld. - Walf
Zal het beginnen als ik het onderleg /etc/systemd/user/ ? - Khurshid Alam


Wellicht bent u geïnteresseerd in het gebruik van de "doorleefde" functionaliteit van systemd. Het is ingeschakeld via loginctl enable-linger USERNAME.

Het veroorzaakt een afzonderlijke servicemanager voor de betreffende gebruiker die wordt gestart bij het opstarten, dus uw door de gebruiker gedefinieerde eenheden in ~/.config/systemd/user wordt opgepikt en verwerkt bij het opstarten en afsluiten volgens uw serviceconfiguratie.

Je kan ook gebruiken systemctl --user voor het beheren en configureren van de service (s), die zal werken op de servicemanager van uw gebruiker, niet die van het systeem.


30
2017-12-11 20:28



systemctl --user is een fantastische bevinding. Bedankt! - Anwar
@byteborg Misschien kun je bijdragen aan unix.stackexchange.com/questions/409900/...? Ik heb afhankelijkheid van PostgreSQL nodig in de gebruikerslepende service, maar de database blijft de systeemservice, niet die van de gebruiker. - Michał F
Als de services eenmaal actief zijn, zijn er dan technieken waarmee de gebruiker de logboeken van de service kan zien? Een niet-bevoorrechte gebruiker zou niet in / var / log / syslog kunnen komen. - mpr
Let daar op systemctl --user lijkt echter niet te werken voor SSH-sessies. - Mark K Cowan
@MarkKCowan het doet, je hoeft alleen maar te zorgen dat je het kunt uitvoeren. In sommige gevallen krijgt u de foutmelding systemd[29239]: PAM unable to dlopen(pam_systemd.so): /lib/security/pam_systemd.so: cannot open shared object file: No such file or directory en PAM adding faulty module: pam_systemd.so wanneer systemctl start user@$USER.service in dat geval gewoon installeren libpam-systemd en je krijgt dat werkend en begint bij het opstarten - Treviño