Установите сервис systemd с помощью автоинструментов - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть проект autotools, который успешно создает и тестирует приложение (https://github.com/goglecm/AutoBrightnessCam). Приложение установлено в каталоге bin (ему предшествует любой префикс, указанный пользователем). Это довольно просто. Теперь мне нужно сделатьСлужба systemd, чтобы запустить его во время загрузки. Я создал файл службы и запустил его вручную, и он отлично работает.

Последний бит - сказать configure.ac и Makefile.am исправить патч * .service..in файл с правильным путем для приложения (точно так же, как config.h создается из config.h.in).

Будет ли уместным использование AC_CONFIG_HEADERS для исправления * .service.in в *.service? Есть ли другой макрос, используемый для «не заголовков», возможно?

Кроме того, как мне указать, что служебный файл должен быть (т.е. установлен) в / etc / systemd / system?

Возможно, есть лучший способ запустить это приложение во время загрузки без systemd?

1 Ответ

1 голос
/ 20 сентября 2019

Подойдет ли использование AC_CONFIG_HEADERS для исправления * .service.in в * .service?Возможно, есть еще один макрос для «не заголовков»?

Нет.AC_CONFIG_HEADERS - для настройки заголовков конфигурации для поддержки вашей сборки.Он редко используется для чего-либо, кроме создания config.h записи результатов определенных тестов, которые выполняет Autoconf, и он не такой гибкий, как другие параметры в этой области.

Если у вас есть дополнительные файлы, которые вы хотитеAutoconf для сборки из шаблонов, тогда вы должны сообщить Autoconf о них через AC_CONFIG_FILES.Пример:

AC_CONFIG_FILES([Makefile AutoBrightnessCam.service])

Но если некоторые данные, которыми вы заполняете этот шаблон, являются установочными каталогами, тогда Autoconf, вероятно, вообще не подходит для этого, поскольку он предусматривает префикс установки длябыть изменено аргументами на make.Вам, по крайней мере, нужно обойти это, но лучше всего покататься с ним и собрать файл .service под контролем make.Это не так сложно, и есть несколько технических преимуществ, некоторые из которых применимы, даже если не нужно беспокоиться о каких-либо заменах установочного каталога.

Вы можете сделать это так же, как configure, запустивтот же самый шаблон, который вы уже используете через sed, с соответствующим сценарием.Нечто подобное может появиться в вашем Makefile.am:

SERVICE_SUBS = \
    s,[@]VARIABLE_NAME[@],$(VARIABLE_NAME),g; \
    s,[@]OTHER_VARIABLE[@],$(OTHER_VARIABLE),g

AutoBrightnessCam.service: AutoBrightnessCam.service.in
    $(SED) -e '$(SERVICE_SUBS)' < $< > $@

Кроме того, как мне указать, что служебный файл должен быть (т.е. установлен) в / etc / systemd / system?

Вы используете Стандартный механизм Automake для указания пользовательских мест установки .Может быть, что-то вроде этого:

sytemdsysdir = $(sysconfdir)/systemd/system

systemdsys_DATA = AutoBrightnessCam.service

Возможно, есть лучший способ запустить это приложение во время загрузки без systemd?

НаСистема на основе systemd, systemd контролирует то, что начинается при загрузке.Если вы хотите, чтобы машина автоматически запускала ваше приложение при загрузке, то я думаю, что ваши параметры ограничены

  • Конфигурирование systemd для его запуска
  • Конфигурирование чего-либо в цепочке программ, в конечном итоге запущенныхдля запуска systemd
  • Взлом загрузчика или ядра для его запуска

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

...