Festlegen der Umgebungsvariablen im systemd-Dienst

12

Ich arbeite mit ROS, das auf meinem Ubuntu korrekt installiert wurde.

Um die ROS source /opt/ros/kinetic/setup.bashauszuführen , müssen wir zuerst ausführen roscore. Wenn ich roscoreohne ausführe source setup.bash, kann der Befehl roscorenicht gefunden werden.

Jetzt möchte ich die ROS ausführen, während das System startet.

Ich habe diesen Link gelesen: /ubuntu/814/how-to-run-scripts-on-start-up

Es scheint, dass ich nur eine benutzerdefinierte Servicedatei erstellen und in diese einfügen muss /etc/systemd/system/. Trotzdem bin ich mir nicht sicher, was ich tun soll, da ich source setup.bashvor der Ausführung einige notwendige Umgebungsvariablen einrichten muss roscore.

Ist es möglich, Umgebungsvariablen in der Servicedatei festzulegen? Für meinen Bedarf muss ich diese Umgebungsvariablen nicht nur für die Ausführung, roscoresondern auch für das gesamte System festlegen .

Ich habe eine andere Idee: Ich setze diese Umgebungsvariablen ein /etc/profileund schreibe eine Servicedatei nur für den Befehl roscore. Funktioniert das?

Yves
quelle

Antworten:

20

Normalerweise haben systemdDienste nur einen begrenzten Satz von Umgebungsvariablen und Dinge in / etc / profile , /etc/profile.d und bashrc- bezogenen Dateien sind nicht festgelegt.

Um Umgebungsvariablen für einen systemdDienst hinzuzufügen , haben Sie verschiedene Möglichkeiten.

Die Beispiele folgt als davon ausgehen , dass roscorebei ist , /opt/ros/kinetic/bin/roscoreda systemdDienste des binären oder Skript konfiguriert , um mit einem vollständigen Pfad haben.


Eine Möglichkeit besteht darin, die EnvironmentOption in Ihrem systemdDienst zu verwenden, und ein einfacher systemdDienst wäre wie folgt.

[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

Sie können auch alle Umgebungsvariablen in eine Datei einfügen, die mit der EnvironmentFileOption im systemdDienst gelesen werden kann .

[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

Eine andere Möglichkeit wäre, ein Wrapper-Skript für Ihre rosBinärdatei zu erstellen und dieses Wrapper-Skript vom systemdDienst aufzurufen . Das Skript muss ausführbar sein, damit es chmod +755 /opt/ros/kinetic/bin/roscore.startupnach dem Erstellen dieser Datei ausgeführt werden kann.

[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

Beachten Sie, dass Sie ausgeführt werden müssen, systemctl daemon-reloadnachdem Sie die Servicedatei bearbeitet haben, um die Änderungen zu aktivieren. Um den Dienst beim Systemstart zu aktivieren, müssen Sie eingeben systemctl enable ros.

Ich bin mit der roscoreBinärdatei nicht vertraut und es kann erforderlich sein , in den ersten beiden Beispielen Type=von simple(dies ist die Standardeinstellung und wird normalerweise nicht benötigt) zu wechseln forking.


Update , da ich vergessen habe, die Umgebungsvariablen für die normalen Anmeldungen zu erwähnen.

Für normale Anmeldungen könnten Sie oder Symlink kopieren /opt/ros/kinetic/setup.bash zu /etc/profile.d/ros.sh , die auf normalen Anmeldungen bezogen werden sollte.

Thomas
quelle
Noch eine Frage: Wenn ich in meiner Servicedatei einige Umgebungsvariablen mit dem Namen setze my_own.service, können andere Servicedateien, Requires=my_own.servicedie diese Umgebungsvariablen enthalten, diese Umgebungsvariablen erben?
Yves
1
Nein, die Umgebung wird nicht vererbt.
Thomas