Ortam ayarlı yürütülebilir yolla bir systemd birim dosyası yazma


17

Bir Java uygulaması için bir systemd birim dosyası yazıyorum ve başlatmak için kullanılan Java sürümünü kontrol etmek istiyorum. (Basitleştirilmiş) hizmet dosyam

[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143

Yeniden başlatmaya çalışırken bir hata alıyorum

Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/app@.service:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: app@1.0.0.service lacks both ExecStart= and ExecStop= setting. Refusing.

Bunun JAVA_HOMEdoğru ayarlandığını biliyorum ; Eğer ExecStartçizgi ile başlamak /usr/bin/javave değiştirmek gibi bir şey eklemek eğer ben -DsomeOption=${JAVA_HOME}sadece iyi görebilirsiniz.

Açık geçici çözüm bir sarıcı komut dosyası oluşturmaktır, ancak bir hizmet dosyası kullanma noktasını yendiğini hissediyorum.

Birim dosyası kullanarak Java uygulamam için JAVA_HOME'u nasıl ayarlayabilirim?


Sarma betiği neden bir hizmet dosyası kullanma amacını tam olarak bozuyor? Hala en sıralaması ve bağımlılık izleme, izleme vb systemd olsun Temelde, fırınlanmış-in lehine biz sysvinit ile vardı uzakta systemd işlemler serbest biçimli programlanabilirliği DTRT mantık. "Doğru olan" systemd'in yapmadığı bir şey olduğunda, bunu bir shell betiğinde olduğu gibi, systemd dışına koymanız gerekir.
Warren Young

@ WarrenYoung - çünkü aniden tekrar kabuk betikleri yönetmeye başladım. Benim durumumda bir kabuk betiğini yönetmemek diğer bitlerden daha yararlıdır.
Robert Munteanu

Sorunu gerçekten görmüyorum. Günlerinizi, yönetmeniz gereken tüm yürütülebilir dosyalar için endişelenerek mi geçiriyorsunuz? :)
Warren Young

3
From systemd.service (5): "İlk bağımsız değişkenin (yani yürütülecek program) bir değişken olmayabilir." Bu, $ {JAVA_HOME} uygulamasının neden uygulama yolunun başında genişletilmediğini, ancak daha sonraki bir noktada kullanıldığını açıklar.
Wieland

@WarrenYoung - İkili dosyaya tek bir sarmalayıcı tercih ederim. Bunun herkes için bir sorun olmadığını anlıyorum, ama benim için :-)
Robert Munteanu

Yanıtlar:


12

Systemd.service (5) içindeki "Komut satırları" bölümünden:

İlk argümanın (yani yürütülecek program) bir değişken olmayabileceğini unutmayın.

Örnek belirleyicisini kullanmayı %iönerecektim (systemd.unit (5) 'de bu konuda daha fazla bilgi edinebilirsiniz), (şimdi geri systemd.service (5)' e geri dönüyoruz):

komut satırının ilk argümanı (yani yürütülecek program) belirtici içermeyebilir.

Bu noktada en iyi seçenek gerçekten Warren Young tarafından önerildiği gibi java ikili yürütme saran bir kabuk komut dosyası oluşturmak ya da doğrudan "Komut Satırları" bölümünde kabuk komut satırları örneğinde olduğu gibi bir kabuk ExecStart olabilir düşünüyorum aşağıdaki örneği içeren systemd.service (5):

ExecStart=/bin/sh -c 'dmesg | tac'

böylece şunları yapabilirsiniz (denenmemiş):

ExecStart=/bin/sh -c '${JAVA_HOME}....'

2

Benzer bir seçenek de kullanmaktır /usr/bin/env:

ExecStart=/usr/bin/env "${JAVA_HOME}/bin/java" -jar ...

Bu şekilde ', alıntı yapılan şeyleri iç içe yerleştirmeniz gerektiğinde yararlı olan tüm komutun etrafındaki tırnak işaretlerini atlayabilirsiniz .

PS. Yan not olarak, değişken adlarını Systemd dosyalarındaki {kaşlı ayraçlara dahil etmek önemlidir, }aksi takdirde doğru şekilde tanınmazlar.

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.