systemd 서비스에서 환경 변수를 설정하는 방법

systemd 서비스에서 환경 변수를 설정하는 방법

저는 ROS를 사용하고 있으며 Ubuntu에 올바르게 설치되었습니다.

source /opt/ros/kinetic/setup.bashROS를 실행하려면 먼저 를 실행 해야 합니다 roscore. roscore실행하지 않으면 source setup.bash명령을 찾을 수 없습니다.roscore

이제 시스템이 시작될 때 ROS를 실행하고 싶습니다.

나는 다음 링크를 읽었습니다.https://askubuntu.com/questions/814/how-to-run-scripts-on-start-up

그냥 사용자 정의 서비스 파일을 만들어서 에 넣으면 될 것 같습니다 . 하지만 실행하기 전에 필요한 환경 변수를 설정 /etc/systemd/system/해야 하기 때문에 아직 어떻게 해야 할지 모르겠습니다 .source setup.bashroscore

서비스 파일에 환경변수를 설정할 수 있나요? 내 필요에 따라 roscore실행뿐만 아니라 전체 시스템에 대해 이러한 환경 변수를 설정 해야 합니다 .

/etc/profile또한 이러한 환경 변수를 설정 하고 명령에 대한 서비스 파일을 작성하겠다는 생각도 있습니다 roscore. 괜찮습니까?

답변1

일반적으로 systemd서비스에는 제한된 환경 변수 세트만 있고 , 및 관련 파일 의 내용은 /etc/profile설정 되지 않습니다./etc/profile.dbashrc

systemd서비스 에 대한 환경 변수를 추가하려면 다양한 가능성이 있습니다.

아래 예에서는 서비스가 바이너리 또는 스크립트를 전체 경로로 구성해야 하기 때문에 roscoreat을 가정합니다./opt/ros/kinetic/bin/roscoresystemd


한 가지 가능성은 서비스에서 이 옵션을 사용하는 것입니다 Environment. 간단한 서비스는 다음과 같습니다.systemdsystemd

[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=.simpleforking


일반 로그인의 경우 에 복사하거나 심볼릭 링크를 걸 수 있으며 /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

관련 정보