Как получить системные переменные, чтобы пережить перезагрузку? - PullRequest
6 голосов
/ 07 июня 2019

У меня есть продукт, предоставленный сторонним поставщиком.Он включает в себя множество сервисов, для которых они предоставляют сценарии запуска в стиле initd.Существует один сценарий для каждой предоставляемой службы.

Эти сценарии ссылаются на переменные, такие как JAVA_HOME, THE_PRODUCT_HOME и так далее.Ожидание от поставщика, что я должен отредактировать эти сценарии вручную и жестко закодировать правильные значения.Я предпочел бы, чтобы эти переменные были инициализированы из переменных окружения, полученных из systemd при загрузке системы.

Я знаю, что могу создать файл конфигурации переопределения для каждой из служб, чтобы обеспечить необходимые условия (так называемые переменные среды), используяsystemctl edit theService но:

  1. Существует довольно много сценариев запуска
  2. Базовые переменные одинаковы
  3. Я бы хотел избежать "systemctl edit" ingкаждый из предоставленных сценариев, если я могу

До сих пор я пытался использовать systemctl set-environment VAR_NAME=some_value.

Это прекрасно работает - пока я не перезагружу систему.Кажется, что переменные, установленные таким образом, определены глобально, но не переживают перезагрузку.Я также попытался использовать systemctl daemon-reload только на тот случай, если это необходимо для «фиксации» настроек (но, похоже, это не спасает глобальные объекты).

На данный момент я отредактировал каждую из них.из поставляемых сценариев запуска и source /path/to/theGlobalVariablesINeed.sh

Это прекрасно работает как обходной путь , но не является моим предпочтительным решением в будущем ...

Вот иллюстрация того, чтопроисходит:

определяют некоторые переменные

[root@dav1-td1 -> ~] # systemctl show-environment
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@dav1-td1 -> ~] #

[root@dav1-td1 -> ~] # systemctl set-environment SYSD_PRODNAME_JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/jre
[root@dav1-td1 -> ~] # systemctl set-environment SYSD_PRODNAME_HOME=/opt/TheProduct-1.2.3
[root@dav1-td1 -> ~] # systemctl daemon-reload        # This is optional, if I run the reload, or do not run the reload, the variables are still lost over a reboot.

демонстрируют, что переменные установлены.

#### Now some variables are set, If I restart a service, the service will
#### Pick up these environmental variable settings.

[root@dav1-td1 -> ~] # systemctl show-environment
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
SYSD_PRODNAME_HOME=/opt/TheProduct-1.2.3
SYSD_PRODNAME_JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/jre
[root@dav1-td1 -> ~] #

Перезапуск системы

#### After restart, the variables have disappeared !?!?

[root@dav1-td1 -> ~] # systemctl show-environment
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@dav1-td1 -> ~] #

Как уже упоминалосьвыше, когда я перезагружаю систему, все среды, которые я установил с помощью systemctl set-environment VAR=value, теряются.

Мне нужны эти переменные, чтобы пережить перезапуск (без использования файлов переопределения для каждой службы и без необходимости создания файла, содержащего всепеременных)

1 Ответ

6 голосов
/ 15 июня 2019

Существуют разные способы решения этой проблемы.

1. Установите переменную среды, используя конфигурацию systemd

Вы можете редактировать /lib/systemd/system/system.conf и добавлять содержимое, как показано ниже

[Manager]
DefaultEnvironment=A=B C=D

2. Установите переменную среды, используя другую службу systemd

[Unit]
Description=Example systemd service init

[Service]
Type=simple
ExecStart=/bin/systemctl set-environment VAR_NAME=some_value

[Install]
WantedBy=sysinit.target

Точка импорта использует WantedBy=sysinit.target, поэтому она загружается раньше

и теперь мы можем создать простой сервис для проверки

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/usr/bin/env

[Install]
WantedBy=multi-user.target

и результат

root@vagrant:/lib/systemd/system# systemctl status tarun
● tarun.service - Example systemd service.
   Loaded: loaded (/lib/systemd/system/tarun.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Sat 2019-06-15 11:31:17 UTC; 5s ago
  Process: 1712 ExecStart=/usr/bin/env (code=exited, status=0/SUCCESS)
 Main PID: 1712 (code=exited, status=0/SUCCESS)

Jun 15 11:31:17 vagrant systemd[1]: Started Example systemd service..
Jun 15 11:31:17 vagrant env[1712]: A=B
Jun 15 11:31:17 vagrant env[1712]: C=D
Jun 15 11:31:17 vagrant env[1712]: LANG=en_US.UTF-8
Jun 15 11:31:17 vagrant env[1712]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Jun 15 11:31:17 vagrant env[1712]: VAR_NAME=some_value
...