Обычно 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
эти переменные окружения, наследовать эти переменные среды?