首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在systemd服务中设置环境变量

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

Unix & Linux用户
提问于 2018-07-14 06:40:31
回答 2查看 88.3K关注 0票数 31

我正在使用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,也是为了整个系统。

我有另一个想法,就是在/etc/profile中设置这些环境变量,只为命令roscore编写一个服务文件,它能工作吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-07-14 11:12:18

通常,systemd服务只有一组有限的环境变量,并且没有设置/etc/profile、/etc/profile.d和bashrc-related文件中的内容。

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

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

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

代码语言:javascript
复制
[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

您还可以将所有环境变量放入一个可以在systemd服务中使用D13选项读取的文件中。

代码语言:javascript
复制
[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服务中调用该包装脚本。脚本需要是可执行的。

代码语言:javascript
复制
chmod 755 /opt/ros/kinetic/bin/roscore.startup

在创建那个文件之后。

代码语言:javascript
复制
[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。要在系统启动时启用服务,必须输入systemctl enable ros。

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

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

票数 54
EN

Unix & Linux用户

发布于 2020-09-15 02:31:56

你可以试试这个

代码语言:javascript
复制
[Unit]
Description=Run command with source /opt/ros/kinetic/setup.bash

[Service]
Type=simple
ExecStart=/bin/bash -c 'source /opt/ros/kinetic/setup.bash && /opt/ros/kinetic/bin/roscore'

[Install]
WantedBy=multi-user.target
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/455261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档