systemd - मेरी सेवा कई तर्क दे रही है


43

क्या मेरे सिस्टमड सेवा को एक से अधिक तर्क देना संभव है?

मैं कई तर्कों के साथ एक कार्यक्रम निष्पादित करना चाहता हूं, जिसे अंतिम उपयोगकर्ता द्वारा तय किया जाना है।

उदाहरण के लिए: ./program arg1 arg2

इसे एक एकल तर्क ऐप शुरू करने के लिए मुझे कुछ इस तरह की आवश्यकता होगी systemctl start arg1@program, जहां मेरे पास सेवा की परिभाषा है ExecStart = /usr/bin/program ℅i

धन्यवाद!


1
लगता है कि आप क्या चाहते हैं एक विन्यास फाइल है।
डैनियल बी

मुझे इसे चलते-फिरते बदलने की जरूरत है। क्या मुझे एक गोपनीय फ़ाइल की सख्त आवश्यकता है?
Peperunas

@peperunas को आपको एक गोपनीय फ़ाइल की आवश्यकता नहीं है, मेरा उत्तर देखें जो बिना किसी अतिरिक्त फ़ाइल के काम करती है
nonagon

जवाबों:


32

हाँ तुम कर सकते हो! उन्हें एक फाइल में कहीं परिभाषित करें और उन्हें EnvironmentFileअपने सिस्टमड सर्विस में जोड़ें । उदाहरण के लिए, /etc/.progconf की सामग्री इस प्रकार है:

ARG1=-o
ARG2=--verbose

और आपकी .service फ़ाइल:

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

अगर आपको उन्हें चलते-फिरते बदलने की जरूरत है तो आप उस फाइल को लिख सकते हैं। एक सेवा को अपने विकल्पों को बहुत बार नहीं बदलना चाहिए, अगर आपको इसे प्राप्त करने की आवश्यकता है, तो ऑटोस्टार्टिंग या क्रॉन पर विचार करें।

अधिक उदाहरणों के लिए देखें: https://wiki.archlinux.org/index.php/Systemd/Services


हेह, काफी आसान है, ऐसा नहीं सोचा था। मुझे हालांकि सहमत होना होगा: सेवा पैरामीटर नियमित आधार पर नहीं बदलते हैं, और न ही उनकी कॉन्फ़िगरेशन फ़ाइलें।
डैनियल बी

यदि सेवा फ़ाइल पर्यावरण चर का उपयोग करती है, तो क्या आप चर कह सकते हैं VAR1=... VAR2=... systemctl start foobar.service?
जोहान्स शाउब -

हां, मेरा मानना ​​है कि आप कर सकते हैं
platforma

6
@ जोहान्सचैब-लिट, आप नहीं कर सकते। एक PassEnvironmentनिर्देश है, लेकिन यह systemdप्रक्रिया से चर लेता है (सामान्य रूप से पीआईडी ​​1), से नहीं systemctlsystemctlप्रक्रिया से पर्यावरण चर सेवा शुरू होने का प्रचार नहीं करते हैं।
cjm

2
लेकिन विभिन्न मानकों के साथ अपस्टार्ट एक ही सेवा के कई उदाहरण चला सकता है। उदाहरण के लिए eth0 पर एक मेल सर्वर और eth1 पर उक्त मेलसर्वर का एक और उदाहरण, अलग-अलग सेवाओं के लिए अपस्टार्ट और उन्हें प्रबंधित करने के लिए पैरामीटर पास करना। क्या systemd ऐसा कर सकता है?
लेटॉर्फ

14

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

मैंने फ़ाइल नाम के साथ एक सेवा बनाई argtest@.service( 'साइन पर अनुगामी' पर ध्यान दें जो तब आवश्यक होता है जब कोई सेवा तर्क देती है )।

[Unit]
Description=Test passing multiple arguments

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

मैं sudo systemctl start argtest@"arg1 arg2 arg3".serviceइसे चलाता हूं और यह पास हो जाता है arg1, arg2और arg3अलग-अलग कमांड-लाइन तर्क के रूप में test.py।


"अनुगामी एम्परसेंड पर ध्यान दें": मुझे आपके उत्तर में कोई एम्परसेंड नहीं मिला। क्या आप इस बिंदु पर स्पष्ट होने के लिए अपने उत्तर को संपादित कर सकते हैं?
पैट्रिक मेव्ज़ेक

हाँ, इस बारे में खेद है!
नॉनगन

मुझे लगता है कि @ की ज़रूरत तभी है जब आप% I का उपयोग करें जैसा कि आप करते हैं। यह सेवा का एक उदाहरण है।
टॉबी

सहमत, मैं बस कुछ ब्लॉग पोस्टों में भाग गया, जो इसे छोड़ दिया। मैं अपने उत्तर में स्पष्ट करूँगा।
नॉनगन

यह किसी अन्य सेवा के भीतर से काम नहीं करता है। मैंने कोशिश की Wants=argtest@"arg1 arg2".serviceऔर केवल पहला तर्क पारित किया गया।
रोजर ड्यूक

1

सबसे आसान मैंने पाया है:

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

यह सब स्वयं को निहित रखता है।

ऐसा कहने के बाद, मैंने पाया है कि कम से कम उबंटू 18.04 एलटीएस पर, मुझे ऐसा करने की आवश्यकता नहीं है, मैं यह कर सकता हूं और यह ठीक काम करता है:

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

$vars इस पैटर्न के साथ तर्क के रूप में भी काम करें।

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