Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумНастройка и подключение

systemd-юнит с переменными: рабочий пример

iron_shell
iron_shell
Знаток
сообщений 1050
с июн
15 июля, 14:42первое сообщение

Выкладываю юнит, который крутит у меня ночной сбор. Вопрос про переменные, которые под службой куда-то деваются, всплывает тут через неделю, так что вот готовый скелет.

[Unit]
Description=nochnoy sbor
After=network-online.target
Wants=network-online.target

[Service] Type=simple User=sbor WorkingDirectory=/opt/sbor EnvironmentFile=/etc/sbor/env Environment=PYTHONUNBUFFERED=1 ExecStart=/opt/sbor/venv/bin/python run.py Restart=on-failure RestartSec=15

[Install] WantedBy=multi-user.target ```

Сам файл /etc/sbor/env:

HTTP_PROXY=http://login:pass@193.0.2.44:8000
HTTPS_PROXY=http://login:pass@193.0.2.44:8000
NO_PROXY=localhost,127.0.0.1,10.0.0.0/8

По ходу вопрос: кавычки вокруг значений в таком файле нужны или лишние?

cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
22 декабря, 17:59#2

Кавычки лишние, и хуже того, они иногда мешают.

Файл окружения читает сам systemd, оболочки там нет вообще. Одну внешнюю пару кавычек он снимет, а вторую оставит внутри значения, и программа получит пароль с кавычкой на конце. Дальше идёт вход с отказом и три часа поиска виноватого.

Из того же ряда, что стоит помнить про этот файл: подстановки вида звёздочка или домашний каталог не раскрываются, ссылки на другие переменные тоже, строка берётся ровно как написана. Примечания живут только с начала строки, дописать их после значения не выйдет, решётка уедет в пароль. Многострочные значения надо переносить обратным слешем. И пробелы вокруг знака равенства попадают в имя переменной, поэтому пишите вплотную.

Ещё мелочь про права: в файле лежит пара входа, так что владельца ставьте того же, под кем идёт служба, и режим 600. Читает файл systemd от корня, ему хватит.

Женя Ковалёв
Женя Ковалёв
Новичок
сообщений 62
с авг, второй сезон
1 мая, 08:16#3

а почему переменные из bashrc служба не видит? юзер же тот же самый

Тимур Ш.
Тимур Ш.
Участник
сообщений 890
с июн
8 октября, 11:33#4

Потому что systemd не поднимает оболочку. Профиль, bashrc и всё, что вы там прописали, читается при входе живого человека в консоль. Служба стартует напрямую от менеджера, и окружение у неё пустое, кроме того, что вписано в юните.

Проверяется в одну команду, вот что реально видит запущенный процесс:

systemctl show -p Environment sbor.service
cat /proc/$(pidof -s python)/environ | tr '\0' '\n' | grep -i proxy

Второе полезнее: оно показывает окружение уже работающего процесса, со всеми правками, которые он мог сделать сам.

бэкап перед правкой конфига
cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
15 марта, 14:50#5
Тимур Ш.: окружение у неё пустое

И добавлю грабли, на которых спотыкаются почти все, включая меня: после правки юнита или файла окружения нужен systemctl daemon-reload, иначе перезапуск подхватит старое.

iron_shell
iron_shell
Знаток
сообщений 1050
с июн
22 августа, 17:07#6

Точно, про daemon-reload забыл дописать, спасибо. Порядок после любой правки такой:

sudo systemctl daemon-reload
sudo systemctl restart sbor.service
systemctl status sbor.service --no-pager
journalctl -u sbor.service -f

Про кавычки поправил у себя, пароль и правда шёл с хвостом. Юнит выше считайте рабочим, забирайте.