저는 ROS를 사용하고 있으며 Ubuntu에 올바르게 설치되었습니다.
source /opt/ros/kinetic/setup.bash
ROS를 실행하려면 먼저 를 실행 해야 합니다 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