Назад | Перейти на главную страницу

Systemd: почему нельзя использовать% i в первом аргументе ExecStart =?

Цитировать 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