Làm thế nào để chỉ định một lệnh systemd môi trường có chứa =?


20

Tôi muốn chỉ định một lệnh Environment systemdchứa =, vd

Environment=CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

và nhận lỗi

[/lib/systemd/system/archiva.service:10] Invalid environment assignment, ignoring: CATALINA_OPTS=-Dappserver.home\=/var/lib/archiva/apache

trong journalctl -xe. Tôi cố gắng để báo giá với "'và trốn thoát =với \không thành công. Điều này dường như không có giấy tờ.

Câu trả lời:


40

Tôi nghĩ vấn đề của bạn là do không gian trong nội dung của biến môi trường. Nhìn vào các ví dụ từ các tài liệu systemd , một bài tập nên là một chuỗi đơn:

Thí dụ:

Environment="ONE=one" 'TWO=two two'
ExecStart=/bin/echo $ONE $TWO ${TWO}

Điều này sẽ thực thi / bin / tiếng vang với bốn đối số: one, two, two, và two two.

Thí dụ:

Environment=ONE='one' "TWO='two two' too" THREE=
ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
ExecStart=/bin/echo $ONE $TWO $THREE

Kết quả trong tiếng vang này được gọi là hai lần, lần đầu tiên với lập luận 'one', 'two two' too, , và lần thứ hai với đối số one, two two, too.

Tôi đã thử nghiệm điều này với dịch vụ sau (lưu ý các trích dẫn xung quanh toàn bộ bài tập):

[Unit]
Description=My Daemon

[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'
ExecStart=/bin/echo ${CATALINA_OPTS}

[Install]
WantedBy=multi-user.target

Và có đầu ra mong muốn trong journalctl:

Apr 26 08:19:29 laptop echo[28439]: -Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

Tất nhiên, nó sẽ đơn giản hơn để sử dụng EnvironmentFilethay thế. Thay thế Environmentbằng cách sau đây cho kết quả mong muốn tương tự:

EnvironmentFile=/tmp/foo

Nơi /tmp/foochứa (lưu ý thiếu dấu ngoặc kép):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

Khi nói đến trích dẫn trích dẫn (ví dụ: bằng cách sử dụng CATALINA_OPTStrong systemdmôi trường cho Apache tomcat7.0.61), sử dụng EnvironmentFilethực sự là cách tốt nhất. Cảm ơn!
Karl Richter

Thư mục tiêu chuẩn / quy ước để giữ một môi trường trên Ubuntu là gì? Trên các hệ thống khác tôi đã thấy / etc / sysconfig /
Davos

1
@Davos một nơi hợp lý sẽ là /etc/default. Các tệp đã được sử dụng trong lịch sử để đặt các biến môi trường cho các tập lệnh init tương ứng.
muru

Tôi đã có tệp này trên hệ thống / etc / môi trường của mình có chứa biến PATH, việc nối thêm vào đó có hợp lý không?
Davos

1
@Davos đó là toàn hệ thống. Nếu không có vấn đề gì với biến được đặt cho thực tế mọi quy trình, chắc chắn. Lưu ý rằng /etc/environmentkhông được xử lý bởi một vỏ; ngoài việc gán biến đơn giản, cú pháp của nó rất khác với cú pháp systemd được ghi chú ở trên hoặc cú pháp shell chung.
muru
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.