एक systemd .service फाइल रनिंग systemd-tmpfiles कैसे लिखें


16

मुझे systemd-tmpfiles --createसिस्टम डिस्ट्रो के साथ बूट प्रक्रिया के दौरान चलने की आवश्यकता है । इसलिए मुझे यह काम करने के लिए एक systemd .service फ़ाइल बनाने की आवश्यकता है।

इस प्रश्न में आप सभी विवरण पढ़ सकते हैं कि मुझे क्या चाहिए और क्यों: सिस्टमड-टैम्पफाइल्स कैसे काम करता है?

मैंने इसके बारे में कुछ डॉक्स पढ़े हैं और मैं निम्नलिखित परीक्षण लिख रहा हूं:

[Unit]
Description=Execute tmpfiles to disable usb-wakeup # see details in the link above
Requires=multi-user.target # see details in the link above
After=multi-user.target    # see details in the link above

[Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --create

[Install]
WantedBy=multi-user.target

लेकिन मुझे यकीन नहीं है, क्योंकि systemd-tmpfilesयह एक साधारण कार्यक्रम नहीं है, बल्कि सिस्टमड का एक टुकड़ा है। मैं अपने सिस्टम को तोड़ना नहीं चाहूंगा।

एक .service फाइल के बारे में कोई सुझाव?


Freedesktop.org/wiki/Software/systemd पर systemd पर प्रचुर दस्तावेज़ देखें । आप सिस्टम के डिफॉल्ट्स को अपनी फाइलों द्वारा ओवरराइड कर सकते हैं।
वॉनब्रांड

जवाबों:


30

[यह सीधे सिस्टमड-टैम्पाइल के मुद्दे को संबोधित नहीं करता है लेकिन मुझे लगता है कि आप पहले से ही पहचान चुके हैं कि इस विशेष मामले में आप केवल इको का उपयोग करके बेहतर हैं।]

सबसे पहले, "multi-user.target" वह हो सकता है या नहीं जो आप उपयोग करना चाहते हैं। यदि आप SysV स्टाइल इनिट स्टफ से रनलेवल्स की अवधारणा से परिचित हैं, तो मल्टी-यूज़र रनलेवल 3 के बराबर सिस्टम है, जो एक मल्टी-यूज़र सिस्टम है जो कंसोल पर बूट होता है, GUI नहीं। रनलेवल 5 के बराबर, जो एक्स के लिए बूट होता है, ग्राफिकल.टार्ग है । डिफ़ॉल्ट में एक सिमलिंक से निर्धारित होता है /etc/systemd/system(और / या /lib/systemd/system; में एक /etcमें एक निष्प्रभावी होगा /lib) कहा जाता default.target , उपयोग ls जहां यह कहते हैं खोजने के लिए:

»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target

सामान्य लिनक्स डेस्कटॉप के लिए यह ग्राफिकल होगा। टारगेट। यह वास्तव में महत्वपूर्ण नहीं है यदि आप चाहते हैं कि आप जो बूट सेवा शुरू कर रहे हैं वह डिफ़ॉल्ट रनलेवल / लक्ष्य की परवाह किए बिना शुरू हो - उस स्थिति में, हम बस default.target का उपयोग कर सकते हैं, और चिंता न करें कि यह किस लिए एक उपनाम है। यदि आप बहु-उपयोगकर्ता का उपयोग करते हैं, हालांकि, और आपका डिफ़ॉल्ट चित्रमय है, तो आपकी सेवा नहीं होगी।

सेवा के आधार पर, अधिक उपयुक्त और विशिष्ट लक्ष्य या सेवाएं हो सकती हैं, जिनके संबंध में आप इसे शुरू करना चाहते हैं। आपके अन्य प्रश्न के आधार पर, default.target शायद ठीक है। एक नोट के रूप में, एक "लक्ष्य" और एक "सेवा" के बीच का अंतर यह है कि एक सेवा में एक [Service]अनुभाग होता है जो वास्तव में एक प्रक्रिया चलाता है; एक लक्ष्य विभिन्न "निर्भर करता है" और "निर्देशों की आवश्यकता" के माध्यम से एक साथ सेवाओं को समूहीकृत करने का एक तरीका है; यह अन्य लक्ष्यों या सेवाओं को ट्रिगर करने से परे खुद का कुछ भी नहीं करता है।

जब कोई सेवा शुरू होती है, तो यह निर्धारित किया जाता है कि अन्य सेवाएँ किस पर निर्भर हैं। इस तरह की एक साधारण, स्टैंड-अलोन घटना के मामले में, जिसे हम बूट प्रक्रिया में देरी से चलाना चाहते हैं, हम निर्देशन के इस संयोजन का उपयोग कर सकते हैं:

[Unit]
After=default.target

[Install]
WantedBy=default.target

सेवा स्थापित होने पर "इंस्टॉल" अनुभाग का उपयोग किया जाता है; "वांटेडबी" एक लक्ष्य को निर्दिष्ट करता है जिसे हम चाहते हैं कि इस सेवा को शामिल किया जाए (जिसका अर्थ है कि अगर यह लक्ष्य चलता है, लेकिन nb। यह निर्धारित नहीं करता है कि यह दूसरों के संबंध में कब चलेगा )। चूंकि हम वास्तव में चाहते हैं कि यह सेवा बाद में जल्द से जल्द चले, इसलिए हम "बाद" खंड निर्दिष्ट करते हैं। यह वास्तव में वांटेडबी लक्ष्य के समान होने की आवश्यकता नहीं है (यह आमतौर पर नहीं है) और पूरी तरह से छोड़ा जा सकता है यदि आप परवाह नहीं करते हैं जब ऐसा होता है; मैं बस इसे कूबड़ पर उपयोग कर रहा हूं कि सामान के संबंध में अधिकांश अन्य सामान चलाए जाएंगे जो कहीं न कहीं उस चीज के लिए जंजीर है Before=default.targetजो निर्दिष्ट है (जिसे हम भी इस्तेमाल कर सकते थे; लक्ष्य के चलने से पहले एक लक्ष्य की चाहत को मूल्यांकित किया जाता है)।

उदाहरण के लिए, मैं सांत्वना के लिए "हैलो वर्ल्ड" प्रतिध्वनित करूंगा। सेवा स्वयं [Service]अनुभाग में वर्णित है :

[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld

कमांड को एक पूर्ण पथ की आवश्यकता है। मेरे द्वारा उपयोग नहीं किए जाने का कारण /usr/bin/echo "hello world"यह है कि यह काम नहीं करेगा (आउटपुट / dev / null में जाता है, मुझे लगता है), और एक सेवा जो एक echo "hello world" > /dev/consoleवसीयत करता है , प्रयोग दर्शाता है कि एक ExecStart निर्देश में शेल पुनर्निर्देशन का उपयोग नहीं किया जाएगा । इसलिए / usr / लोकल / बिन / हेलोवर्ल्ड उस एक लाइन के साथ एक शेल स्क्रिप्ट है echo "hello world" > /dev/console

नोट करें Type=forking, जो शेल स्क्रिप्ट के लिए आवश्यक है।

हमारा पूरा, कम से कम सेवा फ़ाइल सिर्फ उन तीन वर्गों है ( [Unit], [Service], और [Install])। स्थापित करने के लिए, फ़ाइल या एक सिमिलिंक को उसमें / etc / systemd / system या / usr / lib / systemd / system, और:

systemctl --system enable helloworld

इसे छापना चाहिए ln -s ...। यह सेवा को चलाता नहीं है, यह सिर्फ बूट पर चलाने के लिए कॉन्फ़िगर करता है जैसा कि ऊपर चर्चा की गई है।

यह संक्षेप में है। man systemd.unitऔर man systemd.serviceअधिक विवरण है।


1
धन्यवाद, बहुत उपयोगी उत्तर और समस्या हल। सिर्फ एक नोट, मेरे डिस्ट्रो में (चक्र लिनक्स) default.targetमें नहीं है /etc/systemd/system, लेकिन यह केवल में है/usr/lib/systemd/system
इगेंन

कमांड से आउटपुट लॉग हो जाता है (यह कहां जा सकता है)?
वॉनब्रांड

/ Usr / lib / systemd / ... फ़ाइलें फ़ॉलबैक (डिफ़ॉल्ट) हैं, आपको आपका / / / systemd / ... में ड्रॉप करना है
vonbrand

इन दिनों default.targetमें पाया जा सकता है/lib/systemd/system/default.target
czerasz

1
@ कोज़रसाज़ मैं फ़ेडोरा 27 पर ध्यान systemctl set-default ...देता हूँ, अगर मैं इसमें सिम्लिंक छोड़ता हूँ /etc/systemd/system, लेकिन यह एक को नहीं बदलता है /lib, अर्थात, वे अलग-अलग लक्ष्यों पर इंगित करते हैं, लेकिन पूर्व में सामान बाद में ओवरराइड करना चाहिए। यदि आपने इसे स्वयं सेट किया है तो ऐसा हो सकता है। वैसे भी, मैंने दोनों स्थानों में संपादन किया है।
गोल्डीलॉक्स

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