systemd - Cung cấp cho dịch vụ của tôi nhiều đối số


44

Có thể cung cấp dịch vụ systemd của tôi nhiều hơn một đối số không?

Tôi muốn thực thi một chương trình có nhiều đối số phải được quyết định bởi người dùng cuối cùng.

Ví dụ: ./program arg1 arg2

Để bắt đầu nó, một ứng dụng đối số duy nhất tôi cần một cái gì đó như systemctl start arg1@program, trong định nghĩa dịch vụ tôi có ExecStart = /usr/bin/program ℅i.

Cảm ơn!


1
Âm thanh như những gì bạn muốn là một tập tin cấu hình.
Daniel B

Tôi cần phải thay đổi nó trên đường đi. Tôi có thực sự cần một tập tin conf?
peperunas

@peperunas bạn không cần một tập tin conf, hãy xem câu trả lời của tôi hoạt động mà không cần bất kỳ tập tin bổ sung nào
nonagon

Câu trả lời:


34

Có bạn có thể! Xác định chúng trong một tệp ở đâu đó và thêm chúng EnvironmentFilevào Dịch vụ hệ thống của bạn. Ví dụ: giả sử nội dung của /etc/.progconf là:

ARG1=-o
ARG2=--verbose

Và tệp .service của bạn:

EnvironmentFile=/etc/.progconf
ExecStart = /usr/bin/prog $ARG1 $ARG2

Bạn có thể ghi vào tập tin đó nếu bạn cần thay đổi chúng khi đang di chuyển. Một dịch vụ không nên thay đổi tùy chọn của nó rất thường xuyên, có thể xem xét tự động khởi động hoặc cron nếu bạn cần đạt được điều đó.

Để biết thêm ví dụ, hãy kiểm tra: https://wiki.archlinux.org/index.php/Systemd/Service


Heh, khá tiện dụng, đã không nghĩ về điều đó. Tôi phải đồng ý mặc dù: Các tham số dịch vụ không thay đổi thường xuyên và các tệp cấu hình của chúng cũng không thay đổi.
Daniel B

Nếu tệp dịch vụ sử dụng các biến môi trường, bạn có thể nói VAR1=... VAR2=... systemctl start foobar.serviceđể vượt qua các biến không?
Julian Schaub - litb

Vâng, tôi tin rằng bạn có thể
platforma

6
@ JohannesSchaub-litb, không, bạn không thể. Có một lệnh PassEnvironment, nhưng nó lấy các biến từ systemdquá trình (thông thường là PID 1), không phải từ systemctl. Các biến môi trường từ systemctlquá trình không được truyền bá đến dịch vụ đang được bắt đầu.
cjm

2
Nhưng mới bắt đầu có thể chạy nhiều phiên bản của cùng một dịch vụ, với các tham số khác nhau. Ví dụ, một máy chủ thư trên eth0 và một phiên bản khác của máy chủ thư nói trên eth1, chuyển tham số để khởi động và quản lý chúng dưới dạng các dịch vụ riêng biệt. Systemd có thể làm điều này?
LtWorf

15

Tôi muốn làm điều tương tự, nhưng không có một tệp riêng cho mỗi kết hợp đối số. Tôi thấy rằng tôi có thể truyền một đối số dài với các khoảng trắng và sau đó sử dụng tính năng phân tách không gian biến môi trường của systemd để phân tách các đối số.

Tôi đã tạo một dịch vụ với tên tệp argtest@.service( lưu ý dấu 'tại dấu' được yêu cầu khi dịch vụ có đối số ).

[Unit]
Description=Test passing multiple arguments

[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS

Tôi chạy cái này với sudo systemctl start argtest@"arg1 arg2 arg3".servicevà nó vượt qua arg1, arg2arg3như là các đối số dòng lệnh riêng biệt để test.py.


"Lưu ý dấu và" dấu: "Tôi không tìm thấy dấu và trong câu trả lời của bạn. Bạn có thể chỉnh sửa câu trả lời của bạn để rõ ràng hơn về điểm này?
Patrick Mevzek

Vâng, xin lỗi về điều đó!
nonagon

Tôi nghĩ rằng @ chỉ cần thiết khi bạn sử dụng% I như bạn làm. Đó là một ví dụ của dịch vụ.
Toby

Đồng ý, tôi chỉ chạy vào một vài bài đăng trên blog mà bỏ qua nó. Tôi sẽ làm rõ trong câu trả lời của tôi.
nonagon

Điều này dường như không hoạt động từ bên trong một dịch vụ khác. Tôi đã thử Wants=argtest@"arg1 arg2".servicevà chỉ có đối số đầu tiên được thông qua.
Roger Dueck

1

Dễ nhất tôi đã tìm thấy là:

ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""

Giữ tất cả khép kín.

Phải nói rằng, tôi đã thấy rằng ít nhất trên Ubuntu 18.04 LTS, tôi thậm chí không cần phải làm điều đó, tôi có thể làm điều này và nó hoạt động tốt:

ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"

$vars làm việc như là đối số với mô hình này là tốt.

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.