Как установить переменную среды в сервисе systemd

14

Я работаю с ROS, который был установлен на моем Ubuntu правильно.

Чтобы запустить ROS, сначала нужно source /opt/ros/kinetic/setup.bashвыполнить roscore. Если я выполню roscoreбез source setup.bash, команда roscoreне может быть найдена.

Теперь я хочу выполнить ROS во время загрузки системы.

Я прочитал эту ссылку: /ubuntu/814/how-to-run-scripts-on-start-up

Кажется, мне нужно только создать файл пользовательского сервиса и поместить его в /etc/systemd/system/. Но все же я не уверен, что делать, потому что мне нужно source setup.bashнастроить некоторые необходимые переменные среды перед выполнением roscore.

Можно ли установить переменные среды в служебном файле? Для своих нужд я должен установить эти переменные среды не только для выполнения, roscoreно и для всей системы.

У меня есть другая идея, которая заключается в том, что я устанавливаю эти переменные среды /etc/profileи записываю служебный файл только для команды roscore, это будет работать?

Ив
источник

Ответы:

23

Обычно systemdсервисы имеют только ограниченный набор переменных окружения, и вещи в / etc / profile , /etc/profile.d и связанные с bashrc файлы не устанавливаются.

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

В следующих примерах предполагается, что roscoreэто /opt/ros/kinetic/bin/roscoreтак, поскольку systemdслужбы должны иметь двоичный файл или сценарий с полным путем.


Одной из возможностей является использование этой Environmentопции в вашем systemdсервисе, а простой systemdсервис будет следующим.

[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service

[Service]
Type=simple
Environment="One=1" "Three=3"
Environment="Two=2"
Environment="Four=4"
ExecStart=/opt/ros/kinetic/bin/roscore

[Install]
WantedBy=multi-user.target

Вы также можете поместить все переменные среды в файл, который можно прочитать с помощью EnvironmentFileопции в systemdслужбе.

[root@localhost ~]# cat /etc/systemd/system/ros.env
One=1
Three=3
Two=2
Four=4


[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service

[Service]
Type=simple
EnvironmentFile=/etc/systemd/systemd/ros.env
ExecStart=/opt/ros/kinetic/bin/roscore

[Install]
WantedBy=multi-user.target

Другой вариант - создать скрипт-обертку для вашего rosдвоичного файла и вызвать этот скрипт-обертку из systemdслужбы. Сценарий должен быть исполняемым, чтобы обеспечить запуск chmod +755 /opt/ros/kinetic/bin/roscore.startupпосле создания этого файла.

[root@localhost ~]# cat /opt/ros/kinetic/bin/roscore.startup
#!/bin/bash

source /opt/ros/kinetic/setup.bash
roscore


[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service

[Service]
Type=simple
ExecStart=/opt/ros/kinetic/bin/roscore.startup

[Install]
WantedBy=multi-user.target

Обратите внимание, что вам нужно запустить systemctl daemon-reloadпосле того, как вы отредактировали служебный файл, чтобы сделать изменения активными. Чтобы включить сервис на systemboot, необходимо войти systemctl enable ros.

Я не знаком с roscoreдвоичной и это может быть необходимо изменить Type=с simple(это значение по умолчанию и , как правило , не требуется) , чтобы forkingв первых двух примерах.


Обновление , так как я забыл упомянуть переменные окружения для обычных входов в систему.

Для обычных входов в систему вы можете скопировать или использовать символическую ссылку /opt/ros/kinetic/setup.bash в /etc/profile.d/ros.sh, которая должна быть получена при обычном входе.

Томас
источник
Еще один вопрос: если я установлю некоторые переменные окружения в своем служебном файле с именем my_own.service, могут ли другие служебные файлы, содержащие Requires=my_own.serviceэти переменные окружения, наследовать эти переменные среды?
Ив
1
Нет, среда не будет наследоваться.
Томас