我正在使用 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
,这样可以吗?
答案1
通常,systemd
服务只有一组有限的环境变量,并且/etc/profile
、/etc/profile.d
和bashrc
相关文件中的内容未设置。
要为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
EnvironmentFile
您还可以将所有环境变量放入一个文件中,该文件可以使用服务中的选项读取systemd
。
[root@localhost ~]# cat /etc/ros/roscore.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/ros/roscore.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
在编辑服务文件后运行以使更改生效。要在系统引导时启用该服务,您必须输入systemctl enable ros
。
我不熟悉roscore
二进制文件,可能需要将前两个示例中的(这是默认设置,通常不需要)更改Type=
为。simple
forking
对于正常登录,您可以复制或符号链接/opt/ros/kinetic/setup.bash
到/etc/profile.d/ros.sh
,这应该在正常登录时获取。
答案2
你可以尝试用这个
[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