Запуск go сервисов через systemd

Появилось у меня желание, держать MailHog постоянно запущенным в системе. Первым желанием было запускать как всегда его через supervisord, но потом возникла мысль, что теперь у нас есть чудесный systemd создать сервис в котором ничуть не сложнее чем в супервайзере, но не надо плодить лишних сущностей.

Понятно, что всё ниже изложенное не относится только к приложениям написанным на Go.

Буду краток. В каталоге /etc/systemd/system создаём файл с описанием сервиса mailhog.service следующего содержания.

[Unit]
Description=Mailhog mail cather
After=network.target

[Service]
Type=simple
User=ivan
Group=ivan
ExecStart=/usr/local/bin/MailHog
Restart=always

[Install]
WantedBy=multi-user.target

В нём три секции [Unit], [Service], [Install]и в каждой по чайной ложке параметров:

  • Description - словесное описание сервиса
  • After - таргет после которого сервис можно стартовать. Т.е. после того, как сеть уже готова.
  • Type - этот параметр можно опустить, но явно укажем тип нашего сервиса.
  • User - пользователь, от имени которого запускается сервис.
  • Group - группа, под которой запускается сервис.
  • ExecStart - собственно путь к исполняемому файлу сервиса.
  • Restart - указываем, что в случае падения, сервис должен быть перезапущен в любом случае.
  • WantedBy - в каком случае надо запускать сервис.

После того, как описание сервера создано, надо его включить:

# systemctl enable mailhog
Created symlink from /etc/systemd/system/multi-user.target.wants/mailhog.service to /etc/systemd/system/mailhog.service.

И запустить:

sudo systemctl start mailhog

После этого можно полюбоваться на красивую статусную информацию о работе нашего сервиса:

systemctl status mailhog
● mailhog.service - Mailhog mail cather
   Loaded: loaded (/etc/systemd/system/mailhog.service; enabled)
   Active: active (running) since Ср 2016-04-06 10:52:24 MSK; 52s ago
 Main PID: 30376 (MailHog)
   CGroup: /system.slice/mailhog.service
           └─30376 /usr/local/bin/MailHog

апр 06 10:52:24 bileter MailHog[30376]: 2016/04/06 10:52:24 Using in-memory storage
апр 06 10:52:24 bileter MailHog[30376]: 2016/04/06 10:52:24 [SMTP] Binding to address: 0.0.0.0:1025
апр 06 10:52:24 bileter MailHog[30376]: [HTTP] Binding to address: 0.0.0.0:8025
апр 06 10:52:24 bileter MailHog[30376]: 2016/04/06 10:52:24 Serving under http://0.0.0.0:8025/
апр 06 10:52:24 bileter MailHog[30376]: Creating API v1 with WebPath:
апр 06 10:52:24 bileter MailHog[30376]: Creating API v2 with WebPath:
апр 06 10:52:27 bileter MailHog[30376]: [APIv1] GET /api/v1/events

В качестве вишенки на торте: теперь нет нужды самостоятельно заниматься записью логов приложения. Достаточно писать их в stdout/stderr и systemd будет самостоятельно их передавать в journald. Просмотреть логи сервиса можно командой

journalctl -u mailhog.service

Или ограничится только логами записанными начиная с запуска системы

journalctl -u mailhog.service -b

Что почитать?

Я не стану подробно расписывать красоты systemd об этом хватает статей.

 
comments powered by Disqus