我正在使用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编写一个服务文件,它能工作吗?
发布于 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服务如下所示。
[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选项读取的文件中。
[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。要在系统启动时启用服务,必须输入systemctl enable ros。
我对roscore二进制文件并不熟悉,在前两个示例中,可能有必要将Type=从simple (这是默认的,通常不需要)更改为forking。
对于普通登录,您可以将/opt/ros/kinetic/setup.bash复制或符号链接到/etc/profile.d/ros.sh,这应该来源于普通登录。
发布于 2020-09-15 02:31:56
你可以试试这个
[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.targethttps://unix.stackexchange.com/questions/455261
复制相似问题