Как избежать абсолютного пути к исполняемому файлу в systemd?

Как избежать абсолютного пути к исполняемому файлу в systemd?

У меня есть несколько разных проектов, уже содержащих службы Upstart, и я реализую подход для создания символических ссылок на эти службы /etc/initнапрямую из рабочей копии SVN. Upstart предоставляет встроенные скрипты, в которых я могу просто прочитать цель моей символической ссылки и выполнить дополнительные скрипты или исполняемый файл самой службы. Для моей настройки важна только следующая строка:

cd "$(имя_каталога "$(имя_каталога "$(readlink "/etc/init/${UPSTART_JOB}.conf")")")"

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

Я уже знаю, что это systemctl enable /usr/local/.../someApp.serviceпозволяет мнесохранить определение моей службы в рабочей копии SVN. Единственное, чего мне сейчас не хватает, так это правильного принятия моего readlinkподхода, чтобы не нужно было жестко кодировать абсолютный путь. Я читал оспецификаторыуже есть, но, насколько я понимаю, они не предоставляют абсолютных путей и не разрешают символические ссылки.

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

Другой подход, который я имею в виду, — это некий общесистемный скрипт диспетчера, у меня уже есть некоторый общесистемный скрипт /usr/local/vendor, которому я могу пересылать спецификаторы и который реализует мой readlinkподход внешне.

Но есть ли что-то более простое, что я упускаю? Что-то простое, например, следующее, где %fбудет разрешенная цель символической ссылки:

ExecStart = %f/../../bin/someApp.pl

Что кажется проще, чем следующие примеры:

ExecStart = /bin/sh -c "..."

ExecStart = /usr/local/vendor/systemd/dispatcher "%f"

Спасибо!

решение1

Нет, в systemd нет встроенной функции для этого.

Как и в случае с Upstart, вам придется вызвать оболочку.

Связанный контент