У мене є система systemd, для якої потрібно створити каталог /run, але в іншому випадку запускатись як користувач, що не має root. З прикладу блогу я отримав таке рішення:
[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
Магія - у 3 рядках, які слідують за коментарем. Мабуть, ExecStartPre's буде запускатися як root таким чином, але ExecStartзапуск буде виконуватися як зазначений користувач.
Це призвело до 3 питань, хоча:
- Що
-робити перед/bin/mkdir? Я не знаю, чому це там чи що він робить. - Коли
ExecStartPreв одиничному файлі є декілька, вони просто виконуються послідовно в тому порядку, який вони знаходять у файлі одиниці? Або якийсь інший метод? - Це насправді найкраща техніка для досягнення моєї мети - створити каталог запуску, щоб користувач, що не має root, міг ним користуватися?
ExecStartPreпрацює як root, єPermissionsStartOnly=trueдиректива. Він обмежуєUserдирективу лишеExecStartкомандою. Дивіться freedesktop.org/software/systemd/man/systemd.service.html