Intereting Posts
Как получить ранее использованную команду в обратном поиске HP-UX Можем ли мы запустить два системных процесса dbus разной версии? mpd: нет аудиовыхода с PulseAudio, без смешивания с ALSA Есть ли способ загрузить linux непосредственно из MBR? ifconfig wlan0 показывает выборку информации интерфейса: Устройство не найдено Контекстное меню 7zip появляется дважды Понимание времени процессора, затраченного на процесс в пространстве пользователя / ядра Почему практически нет адаптеров WLAN для Linux? Как настроить SSH на рабочем столе Ubuntu и связать с ним поддомен для удаленного доступа к внешней сети? Как избежать sudo при работе с файлами, принадлежащими учетной записи службы? Есть ли glibc API, который может найти приложение для передачи по умолчанию для типа MIME в Linux? Невозможно загрузить libphp5.so undefined symbol: unixd_config apache service не запускается groupadd: group 'terminal' уже существует в Linux Sed / awk / perl: изменение частей, сохраняющих текст, и выравнивание по столбцу Переполнение доменных сокетов UNIX?

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

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

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

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

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

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

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

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

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