Cara mengatur variabel lingkungan dalam layanan systemd

13

Saya bekerja dengan ROS, yang telah diinstal di Ubuntu saya dengan benar.

Untuk menjalankan ROS, pertama-tama kita harus source /opt/ros/kinetic/setup.bashmenjalankan roscore. Jika saya mengeksekusi roscoretanpa source setup.bash, perintah roscoretidak dapat ditemukan.

Sekarang, saya ingin menjalankan ROS saat sistem dinyalakan.

Saya telah membaca tautan ini: /ubuntu/814/how-to-run-scripts-on-start-up

Tampaknya saya hanya perlu membuat file layanan khusus dan memasukkannya ke dalam /etc/systemd/system/. Tetapi saya masih tidak yakin apa yang harus saya lakukan karena saya perlu source setup.bashmengatur beberapa variabel lingkungan yang diperlukan sebelum menjalankan roscore.

Apakah mungkin untuk mengatur variabel lingkungan di file layanan? Untuk kebutuhan saya, saya harus menetapkan variabel lingkungan ini tidak hanya untuk eksekusi roscoretetapi juga untuk keseluruhan sistem.

Saya punya ide lain, yaitu saya mengatur variabel lingkungan ini /etc/profiledan menulis file layanan hanya untuk perintah roscore, apakah itu akan berfungsi?

Yves
sumber

Jawaban:

22

Biasanya systemdlayanan hanya memiliki seperangkat variabel lingkungan terbatas dan hal-hal di / etc / profile , /etc/profile.d dan file terkait bashrc tidak disetel.

Untuk menambahkan variabel lingkungan untuk systemdlayanan, Anda memiliki berbagai kemungkinan.

Contoh sebagai berikut menganggap bahwa roscoreadalah di /opt/ros/kinetic/bin/roscorekarena systemdlayanan harus memiliki biner atau script dikonfigurasi dengan path lengkap.


Satu kemungkinan adalah menggunakan Environmentopsi dalam systemdlayanan Anda dan systemdlayanan sederhana adalah sebagai berikut.

[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

Anda juga dapat menempatkan semua variabel lingkungan ke dalam file yang dapat dibaca dengan EnvironmentFileopsi di systemdlayanan.

[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

Opsi lain adalah membuat skrip wrapper untuk rosbiner Anda dan memanggil skrip wrapper dari systemdlayanan. Skrip harus dapat dieksekusi, untuk memastikan dijalankan chmod +755 /opt/ros/kinetic/bin/roscore.startupsetelah membuat file itu.

[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

Perhatikan bahwa Anda perlu menjalankan systemctl daemon-reloadsetelah Anda mengedit file layanan untuk membuat perubahan aktif. Untuk mengaktifkan layanan di systemboot, Anda harus masuk systemctl enable ros.

Saya tidak terbiasa dengan roscorebiner dan mungkin perlu untuk mengubah Type=dari simple(yang merupakan standar dan biasanya tidak diperlukan) ke forkingdalam dua contoh pertama.


Perbarui , karena saya lupa menyebutkan variabel lingkungan untuk login normal.

Untuk login normal Anda bisa menyalin atau symlink /opt/ros/kinetic/setup.bash ke /etc/profile.d/ros.sh yang harus bersumber pada login normal.

Thomas
sumber
Satu pertanyaan lagi: jika saya menetapkan beberapa variabel lingkungan dalam nama file layanan saya my_own.service, dapatkah file layanan lain yang berisi Requires=my_own.servicemewarisi variabel-variabel lingkungan ini?
Yves
1
Tidak, lingkungan tidak akan diwarisi.
Thomas