Puncte:0

systemd drop-in unit, ExecStartPre ca utilizator root, ExecStart ca utilizator personalizat

drapel ru

Am un serviciu web care rulează folosind systemd, acest serviciu rulează de propriul utilizator și aș dori să execut niște comenzi ExecStartPre, dar rulează ca utilizator root. Deci mai detaliat:

adică /lib/systemd/system/webservice.service

[Unitate]
Wants=network-online.target
După=network-online.target

[Serviciu]
EnvironmentFile=/etc/default/web
Grup=utilizator web
Tip=simplu
Restart=la eșec
WorkingDirectory=/usr/share/web
RuntimeDirectory=web
RuntimeDirectoryMode=0750
ExecStart=/usr/sbin/web --config=/etc/web/config.ini                               

[Instalare]
WantedBy=multi-user.target

și aș dori să am un serviciu drop-in în care să preia dintr-o sursă web fișierul config.ini

adică /etc/systemd/system/web.service.d/local.conf

[Serviciu]
PermissionsStartOnly=true
RestartSec=5
EnvironmentFile=/etc/environment
ExecStartPre=+/usr/bin/curl http://some.url --output /etc/web/config.ini 
ExecStartPre=+chown web:web /etc/web/config.ini  

Configurația de mai sus nu funcționează, deoarece serviciul meu se îngheață în timpul pornirii fără niciun mesaj în niciun jurnal. Există vreo modalitate de a face ca așa ceva să funcționeze?

Andrew Lowther avatar
drapel jp
Configurația pe care ați postat-o ​​face ceea ce doriți? Nu pot spune dacă aveți nevoie de ajutor pentru ca acest lucru să funcționeze dacă doriți să știți dacă există o modalitate mai curată.
drapel ru
Ai dreptate, imi reformulez intrebarea.
Puncte:0
drapel jp

Cred că configurația dvs. de sistem este corectă. Dacă terminalul se blochează când porniți serviciul, atunci aș bănui că ExecStartPre comanda nu iese.

Am rulat următoarele comenzi ca root pe un server Ubuntu 20.04 pentru a testa o configurare similară a serviciului.

Creați un utilizator pentru serviciu.

useradd --system myservice

Creați un script pentru serviciul care înregistrează utilizatorul în care scriptul rulează și în bucle.

cat <<'EOF' > /usr/local/bin/myservice.sh
#!/usr/bin/env bash

# primul argument este numărul de bucle, implicit este infinit
i=${1:--1}
in timp ce :; do
  data >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
  whoami >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
  (( --i == 0 )) && pauză
  dormi ${SLEEP:-60}
Terminat
EOF

Adăugați fișierul de serviciu și fișierul de înlocuire.

cat <<EOF > /etc/systemd/system/myservice.service
[Unitate]
Descriere=Serviciul meu

[Serviciu]
EnvironmentFile=-/etc/default/myservice
Tip=simplu
Utilizator=serviciul meu
Grup=serviciul meu
Restart=la eșec
RuntimeDirectory=serviciul meu
RuntimeDirectoryMode=0750
ExecStart=/bin/bash /usr/local/bin/myservice.sh
EOF

mkdir -p /etc/systemd/system/myservice.service.d/
cat <<EOF > /etc/systemd/system/myservice.service.d/override.conf
[Serviciu]
PermissionsStartOnly=true
ExecStartPre=/bin/bash /usr/local/bin/myservice.sh 1
ExecStartPre=chown myservice.myservice /run/myservice/run.log
EOF

systemctl daemon-reload

Porniți serviciul

systemctl porni myservice.service

Rezultatul este cel așteptat. The alerga.log fișierul arată că scriptul a rulat o dată ca rădăcină și apoi continuă să ruleze ca serviciul meu utilizator până când serviciul este oprit.

root@ubuntu:~# ls -al /run/myservice/
total 4
drwxr-x--- 2 myservice myservice 60 Feb 27 18:23 .
drwxr-xr-x 30 root root 1080 Feb 27 18:23 ..
-rw-r--r-- 1 myservice myservice 73 27 feb 18:23 run.log
root@ubuntu:~# cat /run/myservice/run.log
Duminica 27 februarie 18:23:14 UTC 2022
rădăcină
Duminica 27 februarie 18:23:14 UTC 2022
serviciul meu
Duminica 27 februarie 18:24:14 UTC 2022
serviciul meu

Am constatat că dacă ExecStartPre comanda intră în buclă, apoi terminalul pare să se blocheze când serviciul este pornit. Asta ar putea explica de ce credeți că serviciul dvs. este înghețat. The ExecStartPre este posibil ca comanda să ruleze în continuare sau să nu se poată finaliza.

Alte Note

  • Am descoperit că folosind fie PermissionsStartOnly=true sau ExecStartPre=+... a avut același efect de a rula ExecStartPre script ca root.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.