Mam usystematyzowaną usługę, która musi utworzyć katalog /run
, ale w przeciwnym razie działa jako użytkownik inny niż root. Z przykładu bloga wyprowadziłem następujące rozwiązanie:
[Unit]
Description=Startup Thing
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 -u /opt/thing/doStartup
WorkingDirectory=/opt/thing
StandardOutput=journal
User=thingUser
# Make sure the /run/thing directory exists
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /run/thing
ExecStartPre=/bin/chmod -R 777 /run/thing
[Install]
WantedBy=multi-user.target
Magia tkwi w 3 liniach następujących po komentarzu. Najwyraźniej ExecStartPre
będą działać w ten sposób jako root, ale ExecStart
będą działać jako określony użytkownik.
Doprowadziło to do 3 pytań:
- Co robi
-
przed/bin/mkdir
? Nie wiem, dlaczego tam jest ani co robi. - Jeśli
ExecStartPre
w pliku jednostkowym jest wiele znaków, to czy są one uruchamiane szeregowo w kolejności, w jakiej znajdują się w pliku jednostkowym? Lub jakaś inna metoda? - Czy to rzeczywiście najlepsza technika do osiągnięcia celu, jakim jest utworzenie katalogu uruchamiania, aby użytkownik inny niż root mógł z niego korzystać?
ExecStartPre
działa jako root, jestPermissionsStartOnly=true
dyrektywa. OgraniczaUser
dyrektywę tylko doExecStart
polecenia. Zobacz freedesktop.org/software/systemd/man/systemd.service.htmlOdpowiedzi:
W przypadku jakichkolwiek pytań dotyczących dyrektyw systemowych można użyć
man systemd.directives
do wyszukania strony podręcznika man, która dokumentuje dyrektywę. W przypadkuExecStartPre=
znajdziesz to udokumentowane wman systemd.service
.W dokumentacji dla
ExecStartPre=
znajdziesz wyjaśnienie, że wiodące „-” jest używane do zaznaczenia, że awaria jest tolerowana dla tych poleceń. W takim przypadku jest tolerowany, jeśli/run/thing
już istnieje.Dokumenty tam wyjaśniają również, że „dozwolonych jest wiele wierszy poleceń, a polecenia są wykonywane kolejno jeden po drugim”.
Jedno ulepszenie metody wstępnego tworzenia katalogu nie powoduje, że jest on dostępny do zapisu na całym świecie, gdy potrzebujesz go tylko do zapisu przez konkretnego użytkownika. Bardziej ograniczone uprawnienia zostałyby osiągnięte dzięki:
To sprawia, że katalog należący do konkretnego użytkownika jest w pełni dostępny.
źródło
RuntimeDirectory
iRuntimeDirectoryMode
zbyt.Odpowiedź na nr 3:
Sprawdź dyrektywy
RuntimeDirectory=
iRuntimeDirectoryMode=
dyrektywy. Pełne dokumenty tutaj . Ale w skrócie (niewielka modyfikacja tekstu, ale esencja powinna pozostać):Aby to wykorzystać, powinno to załatwić sprawę:
źródło