Come impostare la variabile ambientale nel servizio systemd


13

Sto lavorando con ROS, che è stato installato correttamente sul mio Ubuntu.

Per eseguire il ROS, dobbiamo prima source /opt/ros/kinetic/setup.basheseguire roscore. Se eseguo roscoresenza source setup.bash, il comando roscorenon può essere trovato.

Ora, voglio eseguire il ROS mentre il sistema si avvia.

Ho letto questo link: /ubuntu/814/how-to-run-scripts-on-start-up

Sembra che ho solo bisogno di creare un file di servizio personalizzato e inserirlo /etc/systemd/system/. Ma ancora non sono sicuro di cosa fare perché devo source setup.bashimpostare alcune variabili ambientali necessarie prima di eseguire roscore.

È possibile impostare variabili ambientali nel file di servizio? Per le mie necessità, devo impostare queste variabili ambientali non solo per l'esecuzione roscorema anche per l'intero sistema.

Ho un'altra idea, che è quella di impostare queste variabili ambientali /etc/profilee scrivere un file di servizio solo per il comando roscore, funzionerà?

Risposte:


22

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.


Un'altra domanda: se imposto alcune variabili ambientali nel mio file di servizio denominato my_own.service, altri file di servizio che contengono Requires=my_own.serviceereditano queste variabili ambientali?
Yves,

1
No, l'ambiente non verrà ereditato.
Thomas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.