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.