दूसरे के साथ एक सिस्टम यूनिट को कैसे शुरू करें और बंद करें?


20

मैं बेड़े के साथ systemd इकाइयों को शेड्यूल करने के लिए CoreOS का उपयोग कर रहा हूं। मेरी दो इकाइयाँ हैं ( firehose.serviceऔर firehose-announce.service। मैं firehose-announce.serviceशुरू करने और साथ-साथ रुकने की कोशिश कर रहा हूँ firehose.service। यहाँ के लिए इकाई फ़ाइल है firehose-announce.service:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service
After=firehose@%i.service
Requires=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

मैं BindsToइस धारणा के साथ उपयोग करने की कोशिश कर रहा हूं कि शुरू और बंद firehose.serviceकरना भी शुरू या बंद हो जाएगा firehose-announce.service। लेकिन यह कभी सही ढंग से नहीं होता है। यदि firehose.serviceरोक दिया firehose-announce.serviceजाता है , तो विफल स्थिति में चला जाता है। लेकिन जब मैं शुरू करता हूं firehose.service, तो firehose-announce.serviceशुरू नहीं होता।

मुझसे यहां क्या गलत हो रहा है?


यहां भी यही समस्या। क्या आपने हल खोज लिया?
नाहिमे

जवाबों:


24

मुझे लगता है कि आखिरकार इस संयोजन को वांछित रूप से प्राप्त करने के लिए सही संयोजन पर ठोकर खाई गई है।

अपनी firehose-announce.serviceइकाई में मैंने केवल एक सेट किया है BindsTo। संपूर्ण इकाई है:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

यह firehose-announce.serviceइकाई को रोकने का कारण होगा जब firehose.serviceकरता है। महान। लेकिन हम इसे फिर से कैसे शुरू करते हैं?

मैं अपनी firehose.serviceइकाई में निर्भरता को उल्टा करता हूँ जैसे:

[Unit]
Description=Firehose server
Wants=firehose-announce@%i.service
Before=firehose-announce@%i.service

[Service]
ExecStartPre=/usr/bin/docker pull firehose/server
ExecStartPre=-/usr/bin/docker rm -f firehose-%i
ExecStart=/usr/bin/docker run --name firehose-%i -p 7474 --env-file /home/core/firehose.env firehose/server
ExecStop=/usr/bin/docker rm -f firehose-%i
User=core
TimeoutStartSec=5m
TimeoutStopSec=20s
RestartSec=30s
Restart=on-failure

[Install]
WantedBy=multi-user.target

[X-Fleet]
X-Conflicts=firehose@*.service

यह कह रही है कि जब यह शुरू firehose.serviceकरना चाहता firehose-announce.serviceहै (लेकिन firehose-announce.serviceशुरू नहीं कर सकते हैं तो विफल नहीं)। यह भी सुनिश्चित करता है कि firehose.serviceपहले शुरू हो firehose-announce.service

मैंने इसका परीक्षण किया और इकाइयाँ अब रुकने लगती हैं और इच्छानुसार एक साथ शुरू होती हैं।


महान, मैं यह कोशिश करूँगा।
nahime

1
जाहिर है, चाहता है = वैकल्पिक का मतलब है। आवश्यकता = एक आवश्यकता है। BindsTo का मतलब है, अगर निर्भरता यानी फ़ायरहोज़-सर्विस बंद हो जाती है तो फ़ायरहोज़-अनाउंस सेवा को भी रोक दिया जाता है। मेरे लिए अच्छी बात लगती है।
मैट

क्या फायरहाउस. सर्विस के बिना इस व्यवहार को प्राप्त करना संभव है?
दोस्त

मैं इस समाधान की कोशिश की, लेकिन एक समस्या में चल रहा है। मेरे पास आवश्यक ए के साथ सेवा है = बी सेवा और बी के साथ सेवा बी के साथ = ए सेवा। जब A असामान्य रूप से बाहर निकलता है, तो मुझे A और B दोनों पुनः आरंभ होते हुए दिखाई देते हैं। लेकिन जब A कोड 0 / SUCESS के साथ बाहर निकलता है, तो दोनों बंद अवस्था में रहते हैं
बग किलर

ExecStartPre = {डैश} -का अंतिम उद्देश्य पर कोई उद्देश्य नहीं है और केवल सभी पर अंतिम उद्देश्य पर कार्य करें
ExecStartPre
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.