एक सिस्टम-सेट फ़ाइल को पर्यावरण-सेट निष्पादन योग्य पथ के साथ लिखना


17

मैं जावा एप्लिकेशन के लिए एक सिस्टमड यूनिट फ़ाइल लिख रहा हूं और मैं इसे शुरू करने के लिए उपयोग किए जाने वाले जावा के संस्करण को नियंत्रित करना चाहता हूं। मेरी (सरलीकृत) सेवा फ़ाइल है

[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

इसे शुरू करने की कोशिश करते समय मुझे एक त्रुटि वापस मिलती है

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.

मुझे पता है कि JAVA_HOMEसही ढंग से सेट है; अगर मैं ExecStartशुरू करने के लिए लाइन बदलूं /usr/bin/javaऔर फिर कुछ जोड़ दूं तो -DsomeOption=${JAVA_HOME}मैं इसे ठीक-ठाक देख सकता हूं।

स्पष्ट वर्कअराउंड एक आवरण स्क्रिप्ट बनाने के लिए है, लेकिन मुझे लगता है कि यह सेवा फ़ाइल का उपयोग करने के बिंदु को हरा देता है।

मैं एक यूनिट फ़ाइल का उपयोग करके अपने जावा एप्लिकेशन के लिए JAVA_HOME कैसे सेट कर सकता हूं?


रैपर स्क्रिप्ट सेवा फ़ाइल का उपयोग करने के उद्देश्य को क्यों पराजित करता है, बिल्कुल? आपको अभी भी सिस्टमैड की सीक्वेंसिंग और डिपेंडेंसी ट्रैकिंग, मॉनिटरिंग इत्यादि मिलती है। मूल रूप से, सिस्टमड फ्री-फॉर्म प्रोग्रामेबिलिटी को दूर करता है जो हमने बेक-इन DTRT लॉजिक के पक्ष में SysVinit के साथ किया था । जब "सही बात" कुछ systemd नहीं करता है, तो आपको उस बाहर के systemd को रखने की जरूरत है, जैसा कि शेल स्क्रिप्ट में है।
वॉरेन यंग

@ArrenYoung - क्योंकि मैं अचानक शेल स्क्रिप्ट को फिर से प्रबंधित करना शुरू करता हूं। मेरे मामले में शेल स्क्रिप्ट का प्रबंधन अन्य बिट्स की तुलना में अधिक उपयोगी नहीं है।
रॉबर्ट मुंटेनू

मैं वास्तव में समस्या नहीं देख रहा हूँ। क्या आप अपने उन सभी निष्पादनों के बारे में चिंता करते हुए दिन बिताते हैं जिन्हें आपको प्रबंधित करना है? :)
वॉरेन यंग

3
Systemd.service (5) से: "ध्यान दें कि पहला तर्क (यानी निष्पादित करने का कार्यक्रम) एक चर नहीं हो सकता है।" यह बताता है कि एप्लिकेशन पथ की शुरुआत में $ {JAVA_HOME} का विस्तार क्यों नहीं किया गया है, लेकिन कुछ बाद के बिंदु पर इसका उपयोग किया जाता है।
वीलैंड

@WarrenYoung - मैं बाइनरी पर एक सिंगल रैपर पसंद करता हूं। मैं समझता हूं कि यह हर किसी के लिए एक मुद्दा नहीं है, लेकिन यह मेरे लिए है :-)
रॉबर्ट मुंटेनू

जवाबों:


12

Systemd.service (5) में "कमांड लाइन" अनुभाग से:

ध्यान दें कि पहला तर्क (यानी निष्पादित करने का कार्यक्रम) एक चर नहीं हो सकता है।

मैं उदाहरण विनिर्देशक का उपयोग करने का सुझाव देने जा रहा था %i(आप इसके बारे में अधिक पढ़ सकते हैं

कमांड लाइन के पहले तर्क (यानी प्रोग्राम को निष्पादित करने के लिए) में विशेषांक शामिल नहीं हो सकते हैं।

मुझे लगता है कि इस बिंदु पर सबसे अच्छा विकल्प वास्तव में एक शेल स्क्रिप्ट बना रहा है जो वॉरेन यंग द्वारा सुझाए गए जावा बाइनरी के निष्पादन को लपेटता है या आप सीधे "कमांड लाइन्स" अनुभाग में शेल कमांड लाइनों के उदाहरण में एक शेल को सीधे खोल सकते हैं। systemd.service (5) जिसका निम्न उदाहरण है:

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

इसलिए आप कर सकते हैं (अप्राप्त):

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

2

एक अन्य समान विकल्प का उपयोग करना है /usr/bin/env:

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

इस तरह से आप 'पूरे कमांड के चारों ओर उद्धरणों को छोड़ सकते हैं जो उपयोगी है अगर आपको उद्धृत सामान को घोंसले में लाने की आवश्यकता है।

पुनश्च। एक साइड नोट के रूप में, सिस्टमड फ़ाइलों में {ब्रेसिज़ }में चर नामों को संलग्न करना महत्वपूर्ण है अन्यथा उन्हें सही ढंग से पहचाना नहीं जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.