如何在 systemd 服務中設置環境變數
我正在使用 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
,行嗎?
通常
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/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
,這應該來自正常登錄。