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.d và bashrc 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.
my_own.service, các tệp dịch vụ khác có chứaRequires=my_own.servicekế thừa các biến môi trường này không?