Como definir variável de ambiente no serviço systemd

13

Estou trabalhando com o ROS, que foi instalado corretamente no meu Ubuntu.

Para executar o ROS, primeiro precisamos source /opt/ros/kinetic/setup.bashexecutar roscore. Se eu executar roscoresem source setup.bash, o comando roscorenão pode ser encontrado.

Agora, quero executar o ROS enquanto o sistema é inicializado.

Eu li este link: /ubuntu/814/how-to-run-scripts-on-start-up

Parece que eu só preciso criar e colocar um arquivo de serviço personalizado /etc/systemd/system/. Mas ainda não tenho certeza do que fazer, pois preciso source setup.bashconfigurar algumas variáveis ​​ambientais necessárias antes da execução roscore.

É possível definir variáveis ​​ambientais no arquivo de serviço? Para minha necessidade, tenho que definir essas variáveis ​​ambientais não apenas para a execução, roscoremas também para todo o sistema.

Tenho outra ideia: definir essas variáveis ​​ambientais /etc/profilee escrever um arquivo de serviço apenas para o comando roscore, funcionará?

Yves
fonte

Respostas:

22

Normalmente, os systemdserviços têm apenas um conjunto limitado de variáveis ​​de ambiente e os itens em / etc / profile , /etc/profile.d e arquivos relacionados ao bashrc não estão definidos.

Para adicionar variáveis ​​de ambiente a um systemdserviço, você tem possibilidades diferentes.

Os exemplos a seguir assumem que roscoreestá em /opt/ros/kinetic/bin/roscoreque os systemdserviços devem ter o binário ou script configurado com um caminho completo.


Uma possibilidade é usar a Environmentopção em seu systemdserviço e um systemdserviço simples seria o seguinte.

[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

Você também pode colocar todas as variáveis ​​de ambiente em um arquivo que pode ser lido com a EnvironmentFileopção no systemdserviço.

[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

Outra opção seria criar um script de wrapper para o seu rosbinário e chamar esse script de wrapper a partir do systemdserviço. O script precisa ser executável, para garantir a execução chmod +755 /opt/ros/kinetic/bin/roscore.startupapós a criação desse arquivo.

[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

Observe que você precisa executar systemctl daemon-reloaddepois de editar o arquivo de serviço para ativar as alterações. Para habilitar o serviço no systemboot, você deve entrar systemctl enable ros.

Eu não estou familiarizado com o roscorebinário e pode ser necessário mudar Type=de simple(que é o padrão e normalmente não é necessário) para forkingos dois primeiros exemplos.


Atualização , como esqueci de mencionar as variáveis ​​de ambiente para os logins normais.

Para logins normais, você pode copiar ou link simbólico /opt/ros/kinetic/setup.bash para /etc/profile.d/ros.sh, que deve ser originado em logons normais.

Thomas
fonte
Mais uma pergunta: se eu definir algumas variáveis ​​ambientais no meu arquivo de serviço chamado my_own.service, outros arquivos de serviço que podem Requires=my_own.serviceherdar essas variáveis ​​ambientais?
Yves
1
Não, o ambiente não será herdado.
Thomas