Tengo un servicio systemd que necesita crear un directorio /run
, pero que se ejecuta como usuario no root. De un ejemplo de blog, obtuve la siguiente solución:
[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
La magia está en las 3 líneas que siguen al comentario. Aparentemente, los ExecStartPre
's se ejecutarán como root de esta manera, pero ExecStart
se ejecutarán como el usuario especificado.
Sin embargo, esto ha llevado a 3 preguntas:
- ¿Qué hace el
-
frente de la/bin/mkdir
? No sé por qué está allí o qué hace. - Cuando hay múltiples
ExecStartPre
's en un archivo de unidad, ¿se ejecutan en serie en el orden en que se encuentran en el archivo de unidad? ¿O algún otro método? - ¿Es esta la mejor técnica para lograr mi objetivo de crear el directorio de ejecución para que el usuario no root pueda usarlo?
ExecStartPre
ejecuta como root es laPermissionsStartOnly=true
directiva. Restringe laUser
directiva solo alExecStart
comando. Consulte freedesktop.org/software/systemd/man/systemd.service.htmlRespuestas:
Para cualquier pregunta sobre las directivas de systemd, puede usar
man systemd.directives
para buscar la página del manual que documenta la directiva. En el caso deExecStartPre=
, lo encontrará documentado enman systemd.service
.Allí en los documentos para
ExecStartPre=
, encontrará explicado que el principal "-" se utiliza para notar que se tolera la falla para estos comandos. En este caso, se tolera si/run/thing
ya existe.Los documentos allí también explican que "se permiten varias líneas de comando y los comandos se ejecutan uno tras otro, en serie".
Una mejora en su método de creación previa del directorio es que no se puede escribir en todo el mundo cuando solo necesita que un usuario en particular lo pueda escribir. Se lograrían permisos más limitados con:
Eso hace que el directorio sea propiedad y esté completamente accesible desde un usuario en particular.
fuente
RuntimeDirectory
yRuntimeDirectoryMode
también.Respuesta al # 3:
Echa un vistazo a las directivas
RuntimeDirectory=
&RuntimeDirectoryMode=
. Documentos completos aquí . Pero en resumen (ligera modificación del texto, pero la esencia debe permanecer):Entonces, para aprovechar eso, esto debería hacer el truco:
fuente