通常,systemd
服务仅具有有限的一组环境变量,并且未设置/ etc / profile,/etc/ profile.d和bashrc相关文件中的内容。
要为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
您还可以将所有环境变量放入一个文件中,该文件可以通过服务中的EnvironmentFile
option 进行读取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
这些服务变量的服务文件可以继承这些环境变量吗?