Цитировать http://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%lines:
Командная строка принимает спецификаторы "%", как описано в systemd.unit (5). Обратите внимание, что первый аргумент командной строки (т.е. программа для выполнения) может не включать спецификаторы.
Я просто столкнулся с вариантом использования, в котором я хотел это сделать.
Почему это невозможно? Есть ли предлагаемый обходной путь?
По словам самого автора (поэтеринг) в этот thread: это запрещено, потому что имя исполняемого файла может потребоваться заранее (например: SELinux нуждается в этом).
Но согласно другим в той же ветке и в который один, все еще работает когда-нибудь.
Учитывая, что большинство спецификаторов можно заранее определить статически (шаблон, машина и т. Д.), В конечном итоге она должна получить поддержку.
А пока одно из решений - запустить оболочку, как указано в комментариях к вопросу и в первом потоке:
ExecStart=/bin/sh -c "exec opt/%i/bin/service --args"
Другое решение - вручную вызвать интерпретатор ELF:
ExecStop=/lib64/ld-linux-x86-64.so.2 /usr/local/bin/%i-cli stop
(По сути, та же идея, что и запуск вручную /usr/bin/perl script.pl
вместо того, чтобы доверять ей сценария)
Один из способов - использовать /usr/bin/env
, а затем выполните команду как обычно.
В моем случае я хотел написать неабсолютную команду npm:
ExecStart=/usr/bin/env npm start -- -p 2345
В вашем случае вы можете сделать что-то вроде
ExecStart=/usr/bin/env some-command/%i/bin