Normalmente, os systemd
serviç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 systemd
serviço, você tem possibilidades diferentes.
Os exemplos a seguir assumem que roscore
está em /opt/ros/kinetic/bin/roscore
que os systemd
serviços devem ter o binário ou script configurado com um caminho completo.
Uma possibilidade é usar a Environment
opção em seu systemd
serviço e um systemd
serviç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 EnvironmentFile
opção no systemd
serviç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 ros
binário e chamar esse script de wrapper a partir do systemd
serviço. O script precisa ser executável, para garantir a execução 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 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 roscore
binário e pode ser necessário mudar Type=
de simple
(que é o padrão e normalmente não é necessário) para forking
os 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.
my_own.service
, outros arquivos de serviço que podemRequires=my_own.service
herdar essas variáveis ambientais?