Команды, ExecStart=
входящие в служебные модули systemd, на самом деле не выполняются в оболочке, поэтому расширения оболочки (например, подстановка команд, которую $(...)
вы там используете) в действительности недоступны.
Вы можете использовать их, вызывая скрипт оболочки явно, с помощью /bin/sh -c '...'
вашего ExecStartPre=
. Например:
ExecStartPre=/bin/sh -c 'systemctl set-environment date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M)'
Обратите внимание, что вам нужно выйти из $
самого себя, используя $$
, иначе systemd попытается интерпретировать как расширение переменной systemd. (На самом деле, как следующий символ (
, один $
может работать там, но удвоение это более правильная настройка.)
Обратите внимание, что использование, systemctl set-environment
как вы делаете, на самом деле не рекомендуется, так как вы создаете глобальную переменную среды, $
которая будет доступна везде.
Вместо этого рассмотрите возможность запуска вашей ExecStart=
команды через оболочку, и в этом случае вы можете определить переменную оболочки $
и просто использовать ее в единственном месте, где вам это нужно:
ExecStart=/bin/sh -c 'date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M); exec java -Xms512m -Xmx1024m ... -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_$$ -verbose:gc ...
Отметьте еще раз, экранируя $
с $$
, поэтому systemd не думает, что это системная переменная для расширения. Кроме того, использование exec
для гарантии того, что оболочка заменена java
процессом, гарантирует, что systemd будет знать, каков основной PID службы.
Выбираясь на Systemd ExecStart=
может стать сложными и обременительными довольно быстро ... Так что рассмотрят вместо сохранения скрипта в файле (в этом случае вам не нужно беспокоиться о побеге $
и %
и о том, как котировки могут работать несколько иначе) и просто запустить этот сценарий из ExecStart=
, это намного проще (хотя для этого требуется дополнительный файл ...)