Systemd

如何在 systemd 服務中設置環境變數

  • January 8, 2021

我正在使用 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.dbashrc相關文件中的內容。

要為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,這應該來自正常登錄。

引用自:https://unix.stackexchange.com/questions/455261