如何在systemd服务中设置环境变量

Yve*_*ves 25 environment-variables systemd

我正在使用 ROS,它已正确安装在我的 Ubuntu 上。

要运行 ROS,我们必须先source /opt/ros/kinetic/setup.bash执行roscore. 如果我在roscore没有 的情况下执行source setup.bashroscore则无法找到该命令。

现在,我想在系统启动时执行 ROS。

我已阅读此链接:https : //askubuntu.com/questions/814/how-to-run-scripts-on-start-up

看来我只需要创建一个自定义服务文件并将其放入/etc/systemd/system/. 但是我仍然不确定该怎么做,因为我需要source setup.bash在执行roscore.

是否可以在服务文件中设置环境变量?根据我的需要,我不仅要为执行,roscore还要为整个系统设置这些环境变量。

我还有一个想法,就是我在里面设置这些环境变量/etc/profile并只为命令写一个服务文件roscore,它会起作用吗?

Tho*_*mas 43

正常情况下systemd的服务只有一组有限的环境变量,并在东西/etc/profile/etc/profile.dbashrc-相关文件设置。

要为systemd服务添加环境变量,您有不同的可能性。

以下示例假设roscore是 at /opt/ros/kinetic/bin/roscore,因为systemd服务必须具有配置完整路径的二进制文件或脚本。


一种可能性是Environment在您的systemd服务中使用该选项,一个简单的systemd服务如下。

[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
Run Code Online (Sandbox Code Playgroud)

您还可以将所有环境变量放入一个文件中,该文件可以使用服务中的EnvironmentFile选项读取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
Run Code Online (Sandbox Code Playgroud)

另一种选择是为您的ros二进制文件制作一个包装脚本,并从systemd服务中调用该包装脚本。脚本必须是可执行的。为了确保,运行

chmod 755 /opt/ros/kinetic/bin/roscore.startup
Run Code Online (Sandbox Code Playgroud)

创建该文件后。

[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
Run Code Online (Sandbox Code Playgroud)

请注意,您需要systemctl daemon-reload在编辑服务文件后运行才能使更改生效。要在系统启动时启用该服务,您必须输入systemctl enable ros.

我不熟悉roscore二进制文件,可能有必要Type=simple(这是默认值,通常不需要)更改forking为前两个示例。


对于普通登录,您可以复制或符号链接/opt/ros/kinetic/setup.bash/etc/profile.d/ros.sh,这应该来自普通登录。

  • 不,环境不会被继承。 (2认同)