Comment définir la variable d'environnement dans le service systemd

13

Je travaille avec ROS, qui a été installé correctement sur mon Ubuntu.

Pour exécuter le ROS, nous devons d'abord source /opt/ros/kinetic/setup.bashpuis exécuter roscore. Si j'exécute roscoresans source setup.bash, la commande roscoreest introuvable.

Maintenant, je veux exécuter le ROS pendant le démarrage du système.

J'ai lu ce lien: /ubuntu/814/how-to-run-scripts-on-start-up

Il semble que je n'ai besoin que de créer un fichier de service personnalisé et de le mettre dans /etc/systemd/system/. Mais je ne sais toujours pas quoi faire, car je dois source setup.bashconfigurer certaines variables d'environnement nécessaires avant d'exécuter roscore.

Est-il possible de définir des variables d'environnement dans le fichier de service? Pour mon besoin, je dois définir ces variables d'environnement non seulement pour l'exécution de roscoremais aussi pour l'ensemble du système.

J'ai une autre idée, qui est de définir ces variables d'environnement /etc/profileet d'écrire un fichier de service uniquement pour la commande roscore, cela fonctionnera-t-il?

Yves
la source

Réponses:

22

Normalement, les systemdservices n'ont qu'un ensemble limité de variables d'environnement et les éléments dans / etc / profile , /etc/profile.d et les fichiers associés à bashrc ne sont pas définis.

Pour ajouter des variables d'environnement pour un systemdservice, vous avez différentes possibilités.

Les exemples suivants supposent que roscoreest à /opt/ros/kinetic/bin/roscorecar les systemdservices doivent avoir le binaire ou le script configuré avec un chemin d'accès complet.


Une possibilité est d'utiliser l' Environmentoption dans votre systemdservice et un systemdservice simple serait le suivant.

[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

Vous pouvez également mettre toutes les variables d'environnement dans un fichier qui peut être lu avec EnvironmentFileoption dans le systemdservice.

[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

Une autre option serait de créer un script wrapper pour votre rosbinaire et d'appeler ce script wrapper à partir du systemdservice. Le script doit être exécutable pour garantir son exécution chmod +755 /opt/ros/kinetic/bin/roscore.startupaprès la création de ce fichier.

[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

Notez que vous devez exécuter systemctl daemon-reloadaprès avoir modifié le fichier de service pour rendre les modifications actives. Pour activer le service sur systemboot, vous devez entrer systemctl enable ros.

Je ne connais pas le roscorebinaire et il pourrait être nécessaire de passer Type=de simple(qui est la valeur par défaut et normalement non nécessaire) à forkingdans les deux premiers exemples.


Mise à jour , car j'ai oublié de mentionner les variables d'environnement pour les connexions normales.

Pour les connexions normales, vous pouvez copier ou créer un lien symbolique /opt/ros/kinetic/setup.bash vers /etc/profile.d/ros.sh qui doit provenir de connexions normales.

Thomas
la source
Une autre question: si je définit des variables d'environnement dans mon fichier de service nommé my_own.service, les autres fichiers de service contenant peuvent-ils Requires=my_own.servicehériter de ces variables d'environnement?
Yves
1
Non, l'environnement ne sera pas hérité.
Thomas