Cách đặt biến môi trường trong dịch vụ systemd


13

Tôi đang làm việc với ROS, đã được cài đặt đúng trên Ubuntu của tôi.

Để chạy ROS, trước tiên chúng ta phải source /opt/ros/kinetic/setup.bashthực thi roscore. Nếu tôi thực hiện roscoremà không có source setup.bash, lệnh roscorekhông thể được tìm thấy.

Bây giờ, tôi muốn thực thi ROS trong khi hệ thống khởi động.

Tôi đã đọc liên kết này: https://askubfox.com/questions/814/how-to-run-scripts-on-start-up

Có vẻ như tôi chỉ cần tạo một tệp dịch vụ tùy chỉnh và đặt nó vào /etc/systemd/system/. Nhưng tôi vẫn không biết phải làm gì vì tôi cần phải source setup.bashthiết lập một số biến môi trường cần thiết trước khi thực hiện roscore.

Có thể đặt các biến môi trường trong tệp dịch vụ không? Đối với nhu cầu của tôi, tôi phải đặt các biến môi trường này không chỉ cho việc thực hiện roscoremà còn cho toàn bộ hệ thống.

Tôi có một ý tưởng khác, đó là tôi đặt các biến môi trường này /etc/profilevà viết một tệp dịch vụ chỉ cho lệnh roscore, nó có hoạt động không?

Câu trả lời:


21

Thông thường systemdcác dịch vụ chỉ có một tập hợp các biến môi trường giới hạn và những thứ trong / etc / profile , các tập tin liên quan /etc/profile.dbashrc không được đặt.

Để thêm các biến môi trường cho một systemddịch vụ, bạn có các khả năng khác nhau.

Các ví dụ như sau cho rằng roscorelà tại /opt/ros/kinetic/bin/roscorekể từ khi systemddịch vụ phải có nhị phân hoặc kịch bản cấu hình với một đường dẫn đầy đủ.


Một khả năng là sử dụng Environmenttùy chọn trong systemddịch vụ của bạn và một systemddịch vụ đơn giản sẽ như sau.

[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

Bạn cũng có thể đặt tất cả các biến môi trường vào một tệp có thể được đọc với EnvironmentFiletùy chọn trong systemddịch vụ.

[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

Một tùy chọn khác là tạo tập lệnh bao bọc cho rostệp nhị phân của bạn và gọi tập lệnh trình bao bọc đó từ systemddịch vụ. Kịch bản cần phải được thực thi, để đảm bảo chạy chmod +755 /opt/ros/kinetic/bin/roscore.startupsau khi tạo tệp đó.

[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

Lưu ý rằng bạn cần chạy systemctl daemon-reloadsau khi bạn đã chỉnh sửa tệp dịch vụ để thực hiện các thay đổi. Để kích hoạt dịch vụ trên systemboot, bạn phải nhập systemctl enable ros.

Tôi không quen thuộc với roscorenhị phân và có thể cần phải thay đổi Type=từ simple(đó là mặc định và thông thường không cần thiết) thành forkinghai ví dụ đầu tiên.


Cập nhật , vì tôi quên đề cập đến các biến môi trường cho thông tin đăng nhập bình thường.

Đối với thông tin đăng nhập bình thường bạn có thể sao chép hoặc liên kết tượng trưng /opt/ros/kinetic/setup.bash để /etc/profile.d/ros.sh cần được bắt nguồn từ thông tin đăng nhập bình thường.


Một câu hỏi nữa: nếu tôi đặt một số biến môi trường trong tệp dịch vụ của mình có tên my_own.service, các tệp dịch vụ khác có chứa Requires=my_own.servicekế thừa các biến môi trường này không?
Yves

1
Không, môi trường sẽ không được kế thừa.
Thomas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.