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

0

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

Para executar o ROS, primeiro temos que source /opt/ros/kinetic/setup.bash executar roscore . Se eu executar roscore sem source setup.bash , o comando roscore não pode ser encontrado.

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

Eu li este link: link

Parece que só preciso criar um arquivo de serviço personalizado e colocá-lo em /etc/systemd/system/ . Mas ainda não sei o que fazer porque preciso source setup.bash para configurar algumas variáveis ambientais necessárias antes de executar 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 de roscore , mas também para todo o sistema.

Eu tenho outra idéia, que é definir essas variáveis ambientais em /etc/profile e escrever um arquivo de serviço apenas para o comando roscore , funcionará?

    
por Yves 14.07.2018 / 08:40

1 resposta

2

Normalmente, systemd services só tem um conjunto limitado de variáveis de ambiente e coisas em / etc / profile , /etc/profile.d e bashrc arquivos relacionados não estão definidos.

Para adicionar variáveis de ambiente para um serviço systemd , você tem diferentes possibilidades.

Os exemplos a seguir assumem que roscore está em /opt/ros/kinetic/bin/roscore , pois systemd services deve ter o binário ou o script configurado com um caminho completo.

Uma possibilidade é usar a opção Environment no seu serviço systemd e um serviço simples systemd 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 opção EnvironmentFile no serviço 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

Outra opção seria criar um script de wrapper para seu ros binário e chamar esse script de wrapper do systemd service. O script precisa ser executável, para garantir a execução de chmod +755 /opt/ros/kinetic/bin/roscore.startup apó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-reload depois de ter editado o arquivo de serviço para ativar as alterações. Para ativar o serviço no systemboot, você precisa digitar systemctl enable ros .

Eu não estou familiarizado com o binário roscore e pode ser necessário alterar Type= de simple (que é o padrão e normalmente não é necessário) para forking nos dois primeiros exemplos.

Atualizar , já que esqueci de mencionar as variáveis de ambiente para os logins normais.

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

    
por 14.07.2018 / 13:12