Обновить

Что нам стоит override для юнита systemd написать? Подумал я как-то пятничным вечером, да чего там, я 100 раз так делал, 5 минут и справимся. Но не тут-то было, в посте хочу разобрать основные ошибки создания override.

Для начала немного теории - зачем он нужен. Как правило такая потребность возникает в сценариях:

  • автор ОС/пакета предусмотрел плохие дефолты или не подходящие для вас. классический пример PrivateTmp=Yes для exim или чего-то похожего

  • вам хочется дополнить/исправить логику работы демона, например очистить кэш, перегенерировать какой-то uuid перед стартом

  • юнит начал много кушать сокетов/памяти и вам хочется расширить-зарезать оные персонально этому юниту. зачастую плохая идея зарезать для определенного класса софта

  • да зачем нужен override, я просто внесу нужные изменения в юнит? нужен, потому что при любом обновлении dnf/apt системный пакет перетрет ваши изменения и вы очень долго будете искать потом что сломалось

Итак, основные ошибки при созданию override файлов:

  • мы все любим в deb based дистрибутивах цветовую схему nano по-умолчанию, прочитать блеклый текст между каких строк нужно писать я с первого раза не смог

    писать надо строго по стрелочке, а не расскоментировать пример
    писать надо строго по стрелочке, а не расскоментировать пример
  • писать нужно включая секцию, но это я помнил и так, пример

### Editing /etc/systemd/system/ssh.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file

[Service]
ExecStartPre=

### Edits below this comment will be discarded
  • у systemd нет шелла. совсем. поэтому пайпы, редиректы и все что связано не работают
    пример нерабочего оверрайда
    [Service]
    ExecStartPre=/usr/bin/uuidgen > /tmp/123
    пример правильного
    [Service]
    ExecStartPre=/bin/sh -c "/usr/bin/uuidgen > /tmp/123"

    без прямого указания шелла у вас uuidgen будет просто выплевываться в journalctl

После правки изменения нужно сохранить и сказать systemctl daemon-reload. Проверить внесенные изменения можно systemctl cat unitname, что не очень наглядно, лучше использовать systemctl status unitname будет виден результирующий юнитфайл.

Надеюсь сэкономил вам несколько минут.

Теги:
+5
Комментарии0
ЕЖЕДНЕВНЫЙ ХАБР | 12 АВГ 2026
Охват56K

Мир, рассчитанный на рост, заканчивается

Некоторые графики объясняют происходящее лучше, чем десяток книг с прогнозами. Вот, например.

Это структура демографической нагрузки в Европе с 1950 года. В 1950-м на сто человек трудоспособного возраста приходился 41 ребёнок и 12 пожилых. В 2023-м - 24 ребёнка и 31 пожилой. Сама нагрузка почти не сдвинулась: 53 иждивенца тогда, 55 сейчас. Перевернулась её структура.

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

Мир, рассчитанный на рост, заканчивается

Публикации