systemd - Memberikan beberapa argumen pada layanan saya

44

Apakah mungkin untuk memberikan layanan systemd saya lebih dari satu argumen?

Saya ingin menjalankan program dengan banyak argumen yang harus diputuskan oleh pengguna akhir.

Misalnya: ./program arg1 arg2

Untuk memulainya aplikasi argumen tunggal saya perlu sesuatu seperti systemctl start arg1@program, di mana dalam definisi layanan yang saya miliki ExecStart = /usr/bin/program ℅i.

Terima kasih!

peperunas
sumber
1
Kedengarannya seperti yang Anda inginkan adalah file konfigurasi.
Daniel B
Saya perlu mengubahnya saat bepergian. Apakah saya benar-benar membutuhkan file conf?
peperunas
@peperunas Anda tidak memerlukan file conf, lihat jawaban saya yang berfungsi tanpa file tambahan
nonagon

Jawaban:

34

Ya kamu bisa! Tentukan mereka dalam file di suatu tempat dan tambahkan ke EnvironmentFiledalam Layanan systemd Anda. Sebagai contoh, katakanlah isi /etc/.progconf adalah:

ARG1=-o
ARG2=--verbose

Dan file layanan Anda:

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

Anda dapat menulis ke file itu jika Anda perlu mengubahnya saat bepergian. Suatu layanan seharusnya tidak terlalu sering mengubah opsi, mungkin mempertimbangkan autostarting atau cron jika Anda perlu mencapainya.

Untuk contoh lebih lanjut, periksa: https://wiki.archlinux.org/index.php/Systemd/Services

platforma
sumber
Heh, cukup praktis, tidak memikirkan itu. Saya harus setuju: Parameter layanan tidak berubah secara teratur, dan file konfigurasi juga tidak.
Daniel B
jika file layanan menggunakan variabel lingkungan, dapatkah Anda mengatakan VAR1=... VAR2=... systemctl start foobar.serviceuntuk lulus variabel?
Johannes Schaub - litb
Ya, saya yakin Anda bisa
platforma
6
@ Johannes Schaub-litb, tidak, Anda tidak bisa. Ada PassEnvironmentarahan, tetapi dibutuhkan variabel dari systemdproses (biasanya PID 1), bukan dari systemctl. Variabel lingkungan dari systemctlproses tidak disebarkan ke layanan yang dimulai.
cjm
2
Tetapi pemula dapat menjalankan beberapa instance dari layanan yang sama, dengan parameter yang berbeda. Misalnya server surat pada eth0 dan contoh lain dari server surat mengatakan pada eth1, meneruskan parameter untuk memulai dan mengelola mereka sebagai layanan terpisah. Bisakah systemd melakukan ini?
LtWorf
15

Saya ingin melakukan hal yang sama, tetapi tanpa file terpisah untuk setiap kombinasi argumen. Saya menemukan bahwa saya bisa melewati satu argumen panjang dengan spasi dan kemudian menggunakan fitur pemisah ruang variabel systemd untuk memisahkan argumen.

Saya membuat layanan dengan nama file [email protected]( perhatikan trailing 'at sign' yang diperlukan ketika layanan mengambil argumen ).

[Unit]
Description=Test passing multiple arguments

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

Saya menjalankan ini dengan sudo systemctl start argtest@"arg1 arg2 arg3".servicedan melewati arg1, arg2dan arg3sebagai argumen baris perintah terpisah untuk test.py.

nonagon
sumber
"note the trailing ampersand": Saya tidak menemukan ampersand di balasan Anda. Bisakah Anda mengedit jawaban Anda agar lebih jelas tentang hal ini?
Patrick Mevzek
Ya maaf soal itu!
nonagon
Saya pikir @ hanya diperlukan ketika Anda menggunakan% I seperti yang Anda lakukan. Ini adalah contoh dari layanan.
Toby
Setuju, saya hanya bertemu dengan beberapa posting blog yang menghilangkannya. Saya akan mengklarifikasi jawaban saya.
nonagon
Ini sepertinya tidak bekerja dari dalam layanan lain. Aku mencoba Wants=argtest@"arg1 arg2".servicedan hanya argumen pertama disahkan.
Roger Dueck
1

Paling mudah yang saya temukan adalah:

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

Menyimpannya tetap lengkap.

Karena itu, saya telah menemukan bahwa setidaknya pada Ubuntu 18.04 LTS, saya bahkan tidak perlu melakukan itu, saya dapat melakukan ini dan berfungsi dengan baik:

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

$vars berfungsi sebagai argumen dengan pola ini juga.

jjxtra
sumber