Cómo configurar la variable ambiental en el servicio systemd

13

Estoy trabajando con ROS, que se ha instalado correctamente en mi Ubuntu.

Para ejecutar el ROS, primero tenemos que source /opt/ros/kinetic/setup.bashejecutarlo roscore. Si ejecuto roscoresin source setup.bash, el comando roscoreno se puede encontrar.

Ahora, quiero ejecutar el ROS mientras se inicia el sistema.

He leído este enlace: /ubuntu/814/how-to-run-scripts-on-start-up

Parece que solo necesito crear un archivo de servicio personalizado y ponerlo en él /etc/systemd/system/. Pero aún no estoy seguro de qué hacer porque necesito source setup.bashconfigurar algunas variables ambientales necesarias antes de ejecutar roscore.

¿Es posible establecer variables ambientales en el archivo de servicio? Para mi necesidad, tengo que establecer estas variables ambientales no solo para la ejecución roscoresino también para todo el sistema.

Tengo otra idea, que es que configuro estas variables ambientales /etc/profiley escribo un archivo de servicio solo para el comando roscore, ¿funcionará?

Yves
fuente

Respuestas:

22

Normalmente, los systemdservicios solo tienen un conjunto limitado de variables de entorno y las cosas en / etc / profile , /etc/profile.d y los archivos relacionados con bashrc no están configurados.

Para agregar variables de entorno para un systemdservicio, tiene diferentes posibilidades.

Los siguientes ejemplos asumen que roscorees así /opt/ros/kinetic/bin/roscoreya que los systemdservicios deben tener el binario o script configurado con una ruta completa.


Una posibilidad es usar la Environmentopción en su systemdservicio y un systemdservicio simple sería el siguiente.

[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

También puede poner todas las variables de entorno en un archivo que se puede leer con EnvironmentFileopción en el systemdservicio.

[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

Otra opción sería crear un script de contenedor para su rosbinario y llamar a ese script de contenedor desde el systemdservicio. El script debe ser ejecutable, para garantizar que se ejecute chmod +755 /opt/ros/kinetic/bin/roscore.startupdespués de crear ese archivo.

[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

Tenga en cuenta que debe ejecutar systemctl daemon-reloaddespués de haber editado el archivo de servicio para que los cambios estén activos. Para habilitar el servicio en systemmboot, debe ingresar systemctl enable ros.

No estoy familiarizado con el roscorebinario y podría ser necesario cambiar Type=de simple(que es el predeterminado y normalmente no es necesario) a forkinglos dos primeros ejemplos.


Actualización , ya que olvidé mencionar las variables de entorno para los inicios de sesión normales.

Para inicios de sesión normales, puede copiar o vincular /opt/ros/kinetic/setup.bash a /etc/profile.d/ros.sh que debe obtenerse en inicios de sesión normales.

Thomas
fuente
Una pregunta más: si configuro algunas variables ambientales en mi archivo de servicio llamado my_own.service, ¿pueden otros archivos de servicio que contienen Requires=my_own.serviceheredar estas variables ambientales?
Yves
1
No, el entorno no será heredado.
Thomas