Як змусити службу systemd запускатися через конкретного користувача та запускатися під час завантаження?


132

Я щойно оновив з сервера Ubuntu 14 до версії 15. У мене виникли проблеми з тим, щоб мій сценарій для запуску працював після оновлення, і прочитав, що systemd є новим за замовчуванням. Я далеко не експерт по Linux, тому будь ласка, будь ласка, на мене :-)

Ось яким був мій сценарій на початку:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

На основі сторінки вікі від початку роботи до системного вікі я використовував надані там таблиці, щоб відобразити речі максимально чітко у своєму новому файлі сервісу systemd:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

Цей файл знаходиться за адресою /home/robert/.config/systemd/user/nzbget.service. Щоб запустити послугу вручну, я робив:

$ systemctl --user start nzbget

Це чудово працює. Однак коли я виходжу з сеансу SSH, служба вимикається. Крім того, він не запускається під час завантаження або входу користувача. Я хочу, щоб він поводився так само, як це робилося як на початковій службі: я хочу, щоб він запускався під час завантаження, працював постійно та як конкретний користувач.

Що мені потрібно зробити, щоб отримати цю конфігурацію?

Відповіді:


163

Перша проблема

Ви можете вказати директиви User=і Group=в [Service]розділі файлу одиниці.

Друга проблема

Щоб служба запускалася під час завантаження, не слід класти її в домашню папку. Натомість покладіть його під /etc/systemd/system/. Це папка, яку повинен використовувати системний адміністратор (тобто ви) для додавання нових загальносистемних служб.

До інших папок належать:

  • /usr/lib/systemd/system/призначений для пакетів, які хочуть встановити одиничні файли, хоча в Debian і Ubuntu папка насправді є /lib/systemd/system/тим, що різні binта libпапки ще не об'єднані в єдиний /usr/префікс.
  • /usr/local/systemd/system/ призначений для установки одиниць локально складеними пакетами.

Тестування приладу

Після того, як файл одиниці знаходиться у відповідному місці, ви можете спробувати запустити пристрій негайно, ввівши, systemctl start <UNIT_FILENAME>як зазвичай. Він повинен працювати без необхідності вводити повний шлях блоку. Розширення також не потрібно вказувати, якщо воно є .service.

Увімкнення блоку

Перш ніж ви зможете включити свій пристрій, вам потрібно додати [Install]розділ, під яким слід додати директиву WantedBy=multi-user.target. Ця директива визначає стадію процесу завантаження, під час якого слід запустити службу (якщо вона була включена). multi-user.targetпідходить для більшості послуг.

Після того, як ця інформація буде додана, ви зможете використовувати systemctl enable <UNIT_FILENAME>, що дає змогу пристрою, зробивши систематизований з цього моменту, автоматично запустити його під час завантаження на вказаному етапі.


Це спрацювало. Мені довелося вказати абсолютний шлях до назви службового файлу в systemctl enableкоманді, хоча для мене це спочатку було не очевидно. Також ввімкнення дало мені попередження про відсутність [Install]розділу. Я проігнорував це, але не впевнений, чи вплине це на його здатність запускатися під час завантаження.
void.pointer

2
InstallПопередження було на самому ділі дуже важливо. Він не запускається при завантаженні без WantedBy=multi-user.targetпід [Install]секцією. Після додавання цього в .serviceфайл, то ви можете enableйого.
void.pointer

4
Прошу вибачення за те, що відповідь залишаю без уваги на такий тривалий час. Я виправив місце, куди повинен перейти файл одиниці, додав відсутніх даних про [Install]розділ. Сподіваюсь, це зараз корисніше для тих, хто шукає його.
Ямахо

5
Це стає набагато простіше, коли шаблону імені користувача передбачено, тобто ваша служба визначається з іменем файлу у форматі, something@.serviceтоді enableяк подібна something@username.serviceнастройка User=%iозначає, що користувач не є жорстким кодом, і кілька користувачів можуть використовувати одне і те ж визначення. Приклад.
Вальф

1
Чи почнеться воно, якщо я його покладу /etc/systemd/user/?
Хуршид Алам

46

Можливо, вам буде цікаво використовувати функцію systemd "затримка користувачів". Це ввімкнено через loginctl enable-linger USERNAME.

Це призводить до того, що окремий диспетчер сервісів для відповідного користувача запускається під час завантаження, тож визначені користувачем одиниці в ~/.config/systemd/userньому будуть вибиратись та оброблятися під час завантаження та відключення відповідно до вашої конфігурації служби.

Ви також можете використовувати systemctl --userдля керування та налаштування служби (служб), яка буде працювати з менеджером обслуговування вашого користувача, а не з системою.


6
systemctl --userце фантастична знахідка. Дякую!
Анвар

@byteborg Можливо, ви можете внести свій внесок у unix.stackexchange.com/questions/409900/… ? Мені потрібна залежність від PostgreSQL у тривалої службі користувача, але база даних залишається системною службою, а не користувацькою.
Michał F

1
Після запуску послуг, чи існують методи, які дозволяють користувачеві бачити журнали послуги? Непривілейований користувач не зможе дістатися до / var / log / syslog.
квітня

2
Зауважте, що systemctl --user, здається, не працює для сеансів SSH.
Марк К Коуан

2
Має бути прийнятим рішення
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.