systemd - Hizmetime birden fazla argüman vermek


44

Sistemd hizmetime birden fazla argüman vermek mümkün mü?

Son kullanıcı tarafından karar verilmesi gereken birden fazla argüman içeren bir program yürütmek istiyorum.

Örneğin: ./program arg1 arg2

Tek bir argüman uygulaması başlatmak için systemctl start arg1@program, nerede hizmet tanımında nerede gibi bir şeye ihtiyacım olacak ExecStart = /usr/bin/program ℅i.

Teşekkürler!


1
İstediğiniz gibi bir config dosyası gibi geliyor.
Daniel B,

Hareket halindeyken değiştirmem gerekiyor. Bir conf dosyasına kesinlikle ihtiyacım var mı?
peperunas

@peperunas bir conf dosyasına ihtiyacınız yok, ek dosya olmadan çalışan cevabımı görün
nonagon

Yanıtlar:


34

Evet yapabilirsin! Bunları bir dosyada tanımlayın ve sistem EnvironmentFileservisinize ekleyin . Örneğin, /etc/.progconf dosyasının içeriği şöyledir:

ARG1=-o
ARG2=--verbose

Ve .service dosyanız:

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

Hareket halindeyken değiştirmeniz gerekirse bu dosyaya yazabilirsiniz. Bir servis seçeneklerini çok sık değiştirmemelidir, belki de bunu başarmanız gerekirse otomatik başlatma veya cron kullanmayı düşünün.

Daha fazla örnek için kontrol edin: https://wiki.archlinux.org/index.php/Systemd/Services


Heh, oldukça kullanışlı, bunu düşünmedim. Yine de aynı fikirdeyim: Hizmet parametreleri düzenli aralıklarla değişmiyor ve yapılandırma dosyaları da değişmiyor.
Daniel B,

Servis dosyası ortam değişkenleri kullanıyorsa VAR1=... VAR2=... systemctl start foobar.service, değişkenleri iletmek için söyleyebilir misiniz?
Johannes Schaub - litb 10:15

Evet, yapabileceğine inanıyorum
platforma

6
@ JohannesSchaub-litb, hayır, yapamazsın. Bir PassEnvironmentyönerge var, ancak systemdsüreçten değişkenleri alıyor (normalde PID 1), değil systemctl. İşlemdeki ortam değişkenleri systemctlbaşlatılan servise yayılmaz.
cjm

2
Ancak, starttart aynı hizmetin birden fazla örneğini farklı parametrelerle çalıştırabilir. Örneğin, eth0 üzerindeki bir posta sunucusu ve eth1'deki söz konusu posta sunucusunun bir başka örneği, parametrenin başlatılması ve ayrı hizmetler olarak yönetilmesi için iletilir. Systemd bunu yapabilir mi?
LtWorf

15

Aynı şeyi yapmak istedim, ancak her bir argüman kombinasyonu için ayrı bir dosya olmadan. Boşluklarla uzun bir argüman iletebileceğimi ve argümanları ayırmak için systemd'nin ortam değişkeninde boşluk bölme özelliğini kullanabileceğimi öğrendim.

Dosya adıyla bir servis yaptım argtest@.service( bir servis argümanları alırken gerekli olan 'tabelada' izini not edin ).

[Unit]
Description=Test passing multiple arguments

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

Ben, bu çalıştırmak sudo systemctl start argtest@"arg1 arg2 arg3".serviceve geçer arg1, arg2ve arg3test.py. ayrı komut satırı bağımsız değişken olarak


"sondaki işareti ve notu not et": cevabınızda hiçbir imi bulamıyorum Bu noktada daha net olması için cevabınızı düzenleyebilir misiniz?
Patrick Mevzek

Evet, bunun için üzgünüm!
nonagon

Sanırım @ yalnızca sizin gibi% I kullandığınızda gerekli. Hizmetin bir örneği.
Toby,

Kabul ediyorum, sadece bunu atlayan birkaç blog yazısı ile karşılaştım. Cevabımı açıklığa kavuşturacağım.
nonagon

Bu, başka bir hizmetin içinden işe görünmüyor. Denedim Wants=argtest@"arg1 arg2".serviceve yalnızca ilk tartışma geçti.
Roger Dueck

1

Bulduğum en kolay şey:

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

Hepsini kendine saklar.

Söylemiştim, en azından Ubuntu 18.04 LTS'de, bunu yapmama gerek bile olmadığını, bunu yapabileceğimi ve iyi çalıştığını gördüm:

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

$vars Bu model ile de argümanlar olarak çalışın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.