установка переменных среды из командной строки внутри файлов модулей

372
zozo6015

Я пытаюсь установить дату внутри файла модуля для регистрации

мой файл модуля выглядит так:

[Unit] Description=Jetty service After=multiuser.target  [Service] Environment=MAIN_CLASS="com.candorgrc.nphase.MainJetty" Type=simple User=jetty Group=jetty WorkingDirectory=/home/jetty/dist PermissionsStartOnly=true ExecStartPre=/bin/systemctl set-environment date=$(/bin/date +%%Y-%%m-%%d-%%H-%%M) ExecStart=/usr/bin/java -Xms512m -Xmx1024m -Djava.util.logging.config.file=/home/jetty/logging.properties -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_$ -verbose:gc -Dcom.sun.management.jmxremote.port=12321 -Dcom.sun.management.jmxremote.authen PIDFile=/var/run/jetty.pid ExecReload=/bin/kill -HUP $MAINPID #Restart=on-failure ExecStop=/bin/kill -9 $MAINPID 

Установка даты не работает. Я получаю следующую ошибку:

Nov 26 16:47:50 vps203756 systemctl[14275]: Failed to set environment: Invalid environment assignments Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Control process exited, code=exited status=1 Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Failed with result 'exit-code'. Nov 26 16:47:50 vps203756 systemd[1]: Failed to start Jetty service. 

Есть идеи, как настроить его для работы?

2

1 ответ на вопрос

1
Filipe Brandenburger

Команды, 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=, это намного проще (хотя для этого требуется дополнительный файл ...)