web-dev-qa-db-fra.com

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

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.bash puis exécutez roscore. Si j'exécute roscore sans source setup.bash, la commande roscore est introuvable.

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

J'ai lu ce lien: https://askubuntu.com/questions/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 parce que je dois source setup.bash pour configurer 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 roscore mais aussi pour l'ensemble du système.

J'ai une autre idée, qui est que je mets ces variables environnementales dans /etc/profile et écrivez un fichier de service uniquement pour la commande roscore, cela fonctionnera-t-il?

12
Yves

Normalement, les services systemd ne disposent que d'un ensemble limité de variables d'environnement et de choses 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 service systemd, vous avez différentes possibilités.

Les exemples suivants supposent que roscore est à /opt/ros/kinetic/bin/roscore puisque systemd les services doivent avoir le binaire ou le script configuré avec un chemin complet.


Une possibilité consiste à utiliser l'option Environment dans votre service systemd et un simple service systemd 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 placer toutes les variables d'environnement dans un fichier qui peut être lu avec l'option EnvironmentFile dans le service 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

Une autre option serait de créer un script wrapper pour votre binaire ros et d'appeler ce script wrapper à partir du service systemd. Le script doit être exécutable pour garantir l'exécution de chmod +755 /opt/ros/kinetic/bin/roscore.startup après avoir créé 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-reload après avoir modifié le fichier de service pour activer les modifications. Pour activer le service sur systemboot, vous devez saisir systemctl enable ros.

Je ne connais pas le binaire roscore et il peut être nécessaire de modifier Type= de simple (qui est la valeur par défaut et normalement non nécessaire) à forking dans les deux premiers exemples.


pdate, 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 devrait provenir de connexions normales.

20
Thomas