LINUX.ORG.RU
решено ФорумAdmin

systemctl edit nginx

 


0

2

Хочу, чтобы перед запуском nginx было ожинание 5 сек., т.к., поднимается спецефический сервис, который создает туннель со своим IP-адресом. nginx должен слушать на этом адресе (Requires и After не помогают, т.к., сервис запускается, но IP-адрес получает через пару секунд).

Если в /lib/systemd/system/nginx.service перед строкой:

ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'

Добавить:

ExecStartPre=/bin/sleep 5

то это работает нормально.

Но если делать, как бы, «кошерно» через systemctl edit nginx с созданием override файла, то получается следующее:

Содержание /etc/systemd/system/nginx.service.d/override.conf:

[Service]
ExecStartPre=/bin/sleep 5
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'

Однако, почему-то сначала выполняется /usr/sbin/nginx -t -q -g 'daemon on; master_process on;', потом /bin/sleep 5 и потом еще раз /usr/sbin/nginx -t -q -g 'daemon on; master_process on;'.

Почему так? Разве override не имеет приоритет и не должен подменять фрагмент оригинального юнита?

Как сделать правильно?

Скрин (это после ручного перезапуска)



Последнее исправление: le_ (всего исправлений: 2)

Почему так?

systemd.service(5)

Commands may be specified by providing multiple command lines in the same directive, or alternatively, this directive may be specified more than once with the same effect. If the empty string is assigned to this option, the list of commands to start is reset, prior assignments of this option will have no effect.

Команды, которые ты вписываешь в override, по дефолту дополняют уже существующий список команд с конца.

Как сделать правильно?

Как минимум, выкинуть костыль со sleep 5.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Как минимум, выкинуть костыль со sleep 5.

Так nginx не будет стартовать после перезагрузки.

Команды, которые ты вписываешь в override, по дефолту дополняют уже существующий список команд с конца.

Разве это справедливо для override?

Тут иное написано: https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units-ru

le_
() автор топика
Ответ на: комментарий от le_

Надо прописать то, чего ты от него хочешь, а не костыльный слип. Ты хочешь чтобы он ждал появления айпи-адреса - вот и пропиши это явно.

firkax ★★★★★
()

Сделай себе отдельный таймер на пять секунд и запускай nginx после него.

Aceler ★★★★★
()
Ответ на: комментарий от le_

Не знаю, стараюсь не иметь дел с systemd и не знаю, что у тебя за сервис там. Но слип (как и другие задержки в секундах) точно плохо: представь, что в момент запуска сеть чуть-чуть лагнёт и адрес появится спустя 6 секунд, и у тебя будет беспричинно неработающий сервис.

Я вижу два варианта:

1) (немного костыльный, но простой) вместо слипа воткни туда скрипт с ifconfig-ом (или ip a show) и проверкой есть ли адрес + sleep 1 в цикле

2) по хорошему демон, поднимающий айпи, должен куда-то слать оповещение об этом, возможно системд даже автоматически умеет следить за интерфейсами

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от intelfx

Как минимум, выкинуть костыль со sleep 5.

Класс! Адепт ненужнод наконец расписался в том что оно «ненужно».

anc ★★★★★
()
Ответ на: комментарий от anc

Мне кажется, ты разговариваешь не со мной. Возможно, стоит провериться на голоса в голове.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от le_

Подскажите, как это прописать?

Имя интерфейса, на котором появляется адрес, известно?

Если да, то можно заюзать systemd-networkd-wait-online. Впиши что-то вроде StartExecPre=/usr/lib/systemd/systemd-networkd-wait-online -i <интерфейс>.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Впиши что-то вроде StartExecPre=/usr/lib/systemd/systemd-networkd-wait-online -i <интерфейс>.

Спасибо за ответ! По всей видимости, это должно работать…

Однако, я решил просто попробовать, вручную позапускать, посмотреть, что будет происходить и… оно почему-то не срабатывает.

Пробовал запускать так:

/usr/lib/systemd/systemd-networkd-wait-online --interface=tun0

Потом так:

/usr/lib/systemd/systemd-networkd-wait-online --interface=tun0 --operational-state=degraded

и так:

/usr/lib/systemd/systemd-networkd-wait-online --interface=tun0 --operational-state=degraded --quiet

После этого стартовал сервис, наблюдал появление tun0, получение адреса и т.п. А systemd-networkd-wait-online как висело так и висело до тех пор пока не отваливалось с сообщением: Event loop failed: Connection timed out.

Нашел еще такую тему: Старт сервиса после получения ip (systemd)

Попробую прописать в [Unit]

Wants=sys-devices-virtual-net-tun0.device
After=sys-devices-virtual-net-tun0.device

le_
() автор топика
Последнее исправление: le_ (всего исправлений: 1)
Ответ на: комментарий от le_

/etc/systemd/system/nginx.service.d/override.conf c содержимым:

[Unit]
Wants=sys-devices-virtual-net-tun0.device
After=sys-devices-virtual-net-tun0.device

работает отлично!

le_
() автор топика

Просто для себя было бы, конечно, интересно уточнить еще, как именно работает override… В каком случае подменяется, в каком дополняется?

И еще, почему не срабатывает /usr/lib/systemd/systemd-networkd-wait-online --interface=tun0?

le_
() автор топика
Ответ на: комментарий от le_

Просто для себя было бы, конечно, интересно уточнить еще, как именно работает override… В каком случае подменяется, в каком дополняется?

Во всех директивах, которые допускают более одного значения — дополняется. Я выше процитировал, как именно это работает и какой синтаксис используется для замены всего списка. Я не знаю, где что иное написано, но мне кажется, что документация к systemd заслуживает большего доверия, чем рандомная статья после машинного перевода.

И еще, почему не срабатывает /usr/lib/systemd/systemd-networkd-wait-online –interface=tun0?

Сам networkd установлен и запущен? Или хотя бы его сокет?

systemctl status systemd-networkd.socket systemd-networkd.service
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Да, systemd-networkd был остановлен. Если запустить, всё работает. Спасибо!

le_
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.