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?
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.