встановлення змінних середовища з командного рядка всередині файлів одиниць


5

Я намагаюся встановити дату в файлі блоку для ведення журналу

мій файл одиниці виглядає так:

[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_${date} -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.

Будь-яка ідея, як налаштувати його на роботу?


Відповіді:


5

Команди в ExecStart=системних блоках обслуговування насправді не виконуються на оболонці, тому розширення оболонок (наприклад, заміни команд, які $(...)ви використовуєте там) насправді недоступні.

Ви можете використовувати їх, зателефонувавши сценарій оболонки явно, з /bin/sh -c '...', у свій ExecStartPre=. Наприклад:

ExecStartPre=/bin/sh -c 'systemctl set-environment date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M)'

Зауважте, що вам потрібно уникнути самого $себе, використовуючи $$, інакше systemd спробує інтерпретувати як розширення systemd змінної. (Насправді, як і наступний символ (, сингл $може працювати там, але подвоєння - це більш правильне налаштування.)

Зауважте, що використовувати так, systemctl set-environmentяк ви робите, насправді не рекомендується, оскільки ви створюєте глобальну змінну середовища, ${date}яка буде доступна всюди.

Натомість розгляньте запуск вашої ExecStart=команди через оболонку, і в цьому випадку ви можете визначити змінну оболонки ${date}і просто використовувати її в єдиному потрібному вам місці:

ExecStart=/bin/sh -c 'date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M); exec java -Xms512m -Xmx1024m ... -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_$${date} -verbose:gc ...

Зауважте ще раз, уникаючи $з $${date}, тому systemd не думає, що це системна змінна для розширення. Крім того, використовуючи execдля забезпечення заміни оболонки на javaпроцес, переконайтесь, що systemd дізнається, що таке основний PID служби.

Вибираючись на Systemd ExecStart=може стати складними і обтяжливими досить швидко ... Так що розглянуть замість збереження скрипта в файлі (в цьому випадку вам не потрібно турбуватися про втечу $і %і про те , як котирування можуть працювати трохи інакше) і просто запустити цей сценарій з ExecStart=, це набагато простіше (навіть якщо для нього потрібен додатковий файл ...)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.