У меня есть несколько разных проектов, уже содержащих службы 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, вам придется вызвать оболочку.