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


14

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

要运行ROS,我们必须先source /opt/ros/kinetic/setup.bash执行roscore。如果我roscore不执行source setup.bash该命令,roscore则找不到该命令。

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

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

看来我只需要创建一个自定义服务文件并将其放入/etc/systemd/system/。但是我仍然不确定该怎么做,因为我需要source setup.bash在执行之前设置一些必要的环境变量roscore

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

我有另一个想法,那就是我设置了这些环境变量/etc/profile并仅为该命令编写了一个服务文件roscore,它将起作用吗?

Answers:


23

通常,systemd服务仅具有有限的一组环境变量,并且未设置/ etc / profile/etc/ profile.dbashrc相关文件中的内容。

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

下面的示例假定roscore处于,/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

您还可以将所有环境变量放入一个文件中,该文件可以通过服务中的EnvironmentFileoption 进行读取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

另一个选择是为ros二进制文件创建包装脚本,然后从systemd服务中调用该包装脚本。该脚本需要是可执行的,以确保chmod +755 /opt/ros/kinetic/bin/roscore.startup在创建该文件后能够运行。

[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

请注意,您需要systemctl daemon-reload在编辑服务文件后运行以使更改生效。要在systemboot上启用该服务,必须输入systemctl enable ros

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


Update,因为我忘记提及普通登录的环境变量。

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


另一个问题:如果我在名为的服务文件中设置了一些环境变量my_own.service,则其他包含Requires=my_own.service这些服务变量的服务文件可以继承这些环境变量吗?
伊夫

1
不,环境不会被继承。
托马斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.