सिस्टमड: पहली बार विफल होने पर "ऑनशॉट" सेवा को कैसे आश्वस्त किया जाए?


18

मैंने सिस्टमड सर्विस मैनपेज को कुछ बार पढ़ा है, लेकिन मैं अभी भी एक बुनियादी सिस्टमड पैटर्न का पता नहीं लगा सकता:

मैं एक बार स्टार्टअप प्रक्रिया (जैसे डॉकटर कंटेनर, या ड्राइव को प्रारूपित करना) को सफलतापूर्वक पूरा करना चाहता हूं। लेकिन अगर मैं इसके लिए Type = oneshot का उपयोग करता हूं, तो मैं Restart = on-विफलता का उपयोग नहीं कर सकता हूं, और यदि यह विफल रहता है, तो यह नौकरी को वापस नहीं लेगा। क्या में यहां कुछ भूल रहा हूँ?

मैंने Restart = on-विफलता के साथ टाइप = सिंपल सेट करने की भी कोशिश की, लेकिन कई मामलों में मुझे निम्नलिखित व्यवहार (मैनपेज से) की आवश्यकता होती है जो ऑनशॉट सेवाएं देते हैं:

Oneshot का व्यवहार सरल के समान है; हालाँकि, यह अपेक्षित है कि सिस्टम को फॉलो-अप इकाइयों को शुरू करने से पहले प्रक्रिया से बाहर निकलना होगा।

अपडेट:


मैंने जो एक वर्कअराउंड का उपयोग किया है , उसे इस तरह से छोड़ना Restartऔर लपेटना my_cmdहै: ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'कुछ उचित TimeoutStartSecमूल्य के साथ।
rozcietrzewiacz

क्या आपने FailureAction = को देखा है ? Restart=सेटिंग FailureAction=[self.unit](इकाई के नाम के साथ [self.unit) को प्रतिस्थापित करके उसी चीज़ को प्राप्त करने में सक्षम हो सकता है । यह हैकरी की तरह है, लेकिन कम से कम स्पष्ट और अनुसरण करने में आसान है।
सेंटिमेन

@ सेंटिमेन FailureActionसमान मान लेता है StartLimitAction, और सभी को छोड़कर noneकिसी प्रकार का बंद ट्रिगर होता है।
20

जवाबों:


5

एक संभव समाधान मैं कोशिश कर रहा हूँ

  [Unit]
    Description=Tags instance and EBS vols
    After=docker.service
    Requires=docker.service

    [Service]
    ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
    ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
    ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
    Restart=on-failure
    RestartSec=30

जहां निष्पादन के अंत में स्क्रिप्ट tag.shहोगी touch /ack/TAG_SUCCESS। मेरा मानना ​​है कि यह वांछित व्यवहार के बहुत करीब है क्योंकि ExecStartPreक्रमिक रूप से निष्पादित होगा, कॉल करने से पहले सफल समापन की प्रतीक्षा कर रहा है ExecStartऔर यूनिट को केवल Startingएक बार माना ExecStartजाता है जिसे इस बिंदु से कहा जाता है कि हमें यकीन है कि हमने स्टार्टअप कार्य पूरा कर लिया है।

लेकिन यह अभी भी एक विशालकाय हैक की तरह लगता है?


यह मेरे लिए अच्छी तरह से काम करता है, सिवाय इसके कि मुझे RemainAfterExit=yesयूनिट को "सक्रिय" रहने के लिए सेट करना था ताकि अन्य इकाइयां इस पर निर्भर रह सकें।
Guss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.