Normalmente i systemdservizi hanno solo un insieme limitato di variabili d'ambiente e le cose in / etc / profile , /etc/profile.d e i file relativi a bashrc non sono impostati.
Per aggiungere variabili d'ambiente per un systemdservizio hai diverse possibilità.
Gli esempi come segue per scontato che roscoreè alla /opt/ros/kinetic/bin/roscorefin systemdservizi devono avere il binario o script di configurato con un percorso completo.
Una possibilità è quella di utilizzare l' Environmentopzione nel tuo systemdservizio e un systemdservizio semplice sarebbe il seguente.
[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
È inoltre possibile inserire tutte le variabili di ambiente in un file che può essere letto con l' EnvironmentFileopzione nel systemdservizio.
[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
Un'altra opzione sarebbe quella di creare uno script wrapper per il tuo file rosbinario e chiamare quello script wrapper dal systemdservizio. Lo script deve essere eseguibile, per garantire l'esecuzione chmod +755 /opt/ros/kinetic/bin/roscore.startupdopo la creazione di quel file.
[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
Si noti che è necessario eseguire systemctl daemon-reloaddopo aver modificato il file di servizio per rendere attive le modifiche. Per abilitare il servizio all'avvio del sistema, è necessario accedere systemctl enable ros.
Non ho familiarità con il roscorebinario e potrebbe essere necessario passare Type=da simple(che è l'impostazione predefinita e normalmente non necessaria) a forkingnei primi due esempi.
Aggiornamento , poiché ho dimenticato di menzionare le variabili di ambiente per i normali accessi.
Per gli accessi normali è possibile copiare o collegare simbolicamente /opt/ros/kinetic/setup.bash in /etc/profile.d/ros.sh che deve essere fornito con accessi normali.
my_own.service, altri file di servizio che contengonoRequires=my_own.serviceereditano queste variabili ambientali?