Confus par les inputs ExecStartPre dans le file unité systemd

J'ai un service systemd qui doit créer un directory dans /run , mais sinon courir en tant qu'user non root. D'un exemple de blog, j'ai dérivé la solution suivante:

 [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 magie est dans les 3 lignes qui suivent le commentaire. Apparemment, le ExecStartPre s'exécute en tant que root de cette façon, mais ExecStart s'exécute en tant qu'user spécifié.

Cela a conduit à 3 questions cependant:

  1. Que fait le - faire devant le /bin/mkdir ? Je ne sais pas pourquoi c'est là ou ce qu'il fait.
  2. Quand il y a plusieurs ExecStartPre dans un file unité, sont-ils exécutés en série dans l'ordre où ils se trouvent dans le file unité? Ou une autre méthode?
  3. Est-ce vraiment la meilleure technique pour atteindre mon objective d'get le directory d'exécution créé afin que l'user non root puisse l'utiliser?

Pour toute question sur les directives systemd, vous pouvez utiliser man systemd.directives pour searchr la page man qui documente la directive. Dans le cas de ExecStartPre= , vous le findez documenté dans man systemd.service .

Là dans docs pour ExecStartPre= , vous findez qu'il a expliqué que le principal "-" est utilisé pour noter que l'échec est toléré pour ces commands. Dans ce cas, il est toléré si /run/thing existe déjà.

Les documents y expliquent également que "plusieurs lignes de command sont autorisées et que les commands sont exécutées les unes après les autres, en série".

Une amélioration apscope à votre méthode de pré-création du directory ne le rend pas inscriptible dans le monde entier lorsque vous en avez seulement besoin pour être inscriptible par un user particulier. Des permissions plus limitées seraient accomplies avec:

  ExecStartPre=-/bin/chown thingUser /run/thing ExecStartPre=-/bin/chmod 700 /run/thing 

Cela rend le directory détenu par et entièrement accessible à partir d'un user particulier.