जब मेरी निर्भरता अपग्रेड हो जाती है तो मेरी सिस्टमड सेवा को कैसे पुनः आरंभ किया जाए


12

मैंने एक प्रोग्राम लिखा है जो एक Postgres डेटाबेस का उपयोग करता है, और मैंने इसके लिए एक सिस्टमड सर्विस फ़ाइल लिखी है। वर्तमान में मेरी सेवा ठीक-ठीक बूट पर शुरू हो जाती है, और जब पोस्टग्रेज को अपग्रेड (बंद) के लिए रोका जाता है तो यह बंद हो जाता है apt upgrade। हालाँकि, जब नवीनीकरण पूरा हो जाता है और पोस्टग्रेज को फिर से शुरू किया जाता है, तो मेरी सेवा स्वचालित रूप से शुरू नहीं होती है।

क्या मैं अपनी सेवा को फिर से स्वचालित रूप से शुरू करने के लिए कुछ निर्भरता को परिभाषित कर सकता हूं?

पोस्टग्रेज के अपग्रेड के दौरान इसे स्वचालित रूप से रोक दिए जाने के बाद यह मेरी सेवा की स्थिति है:

● tabill.service - My service
   Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
 Main PID: 1048 (code=killed, signal=TERM)

ध्यान दें कि मैं मैन्युअल रूप से सेवा को फिर से ठीक शुरू कर सकता हूं।

यहाँ मेरी सेवा फ़ाइल है:

[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service

[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60

[Install]
WantedBy=multi-user.target

मैं जोड़ने की कोशिश की है PartOf=postgresql.serviceऔर BindsTo=postgresql.service, और फिर मैन्युअल रूप से रोकने और Postgres शुरू करने, लेकिन न तो मदद की।

बेशक, मैं इसे हटा सकता था Requires, लेकिन दोनों सेवाओं को एक साथ रोकना बेहतर है, अगर केवल वे दोनों वापस शुरू कर देंगे।


PartOf=सही समाधान की तरह लगता है। क्या आपने इसे Requires=हटाने की कोशिश की ?
meuh

@meuh मैंने इसे अब Requires=हटाए जाने की कोशिश की , इससे कोई मदद नहीं मिली। मुझे लगता है कि समस्या यह है कि PartOf=लिंक "इकाइयों को रोकना और फिर से शुरू करना" है, लेकिन अपग्रेड के दौरान पोस्टग्रेज को फिर से शुरू नहीं किया गया है। इसे रोका गया, अपग्रेड किया गया और शुरू किया गया।
रेनेक्स

पर्याप्त रूप से, जब आप करते हैं systemctl restart postgresql, तो सिस्टमड अपनी निर्भर सेवाओं को फिर से शुरू करने के लिए याद करता है। ऐसा लगता है कि किसी कारण से, के संयोजन के बजाय stopऔर के startबजाय restart
डब्ल्यूजीएच

जवाबों:


14

मुझे उत्तर मिला: मुझे सेवा फ़ाइल की अंतिम पंक्ति बदलने की आवश्यकता है:

WantedBy=postgresql.service

इस तरह, जब भी Postgres शुरू होता है, मेरी सेवा भी शुरू हो जाती है - लेकिन अगर मेरी सेवा विफल हो जाती है, तो वह Postgres को रोक नहीं पाती है।

[Install]अनुभाग में निर्देश केवल इकाइयों को सक्षम और अक्षम करने को प्रभावित करते हैं। लेकिन यह इतना आसान नहीं था जब मेरी सेवा पहले से ही सक्षम थी:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

त्रुटि संदेश भ्रामक था। इसे ठीक करना सरल था:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

अब जब भी Postgres करता है तो मेरी सेवा बंद हो जाती है और शुरू हो जाती है। और स्वाभाविक रूप से Postgres तब शुरू होता है जब सिस्टम बूट होता है।

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