Systemd शुरू होने के तुरंत बाद सेवा को मार देता है


15

मैं ओएसएसईसी एड्स के लिए सिस्टमड यूनिट फाइल लिख रहा हूं। समस्या यह है कि जब सिस्टमड सेवा शुरू करता है तो यह तुरंत उन्हें रोक देता है।

जब मैं उस ExecStart को सभी ठीक काम करने का निर्देश देता हूं।

ExecStart=/var/ossec/bin/ossec-control start

लेकिन जब मैं OSSEC लॉग में छोटा सुधार करता हूं, तो यह शुरू होने के बाद SIG 15 प्राप्त करता है।

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start'

यदि मैं एक और छोटा परिवर्तन सेवा करता हूँ तो 20 सेकंड के बाद SIG 15 प्राप्त होगा।

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start && sleep 20'

तो, मुझे लगता है, कि systemd सेवा शुरू होने के बाद / बिन / श प्रक्रिया को मारता है, और बिन / श फिर OSSEC को मारता है।

इस समस्या का समाधान किस प्रकार से किया जा सकता है?


1
सेवा का प्रकार क्या है?
विआलैंड

@Wieland, मैं सरल और समझदार होने की कोशिश कर रहा था, लेकिन परिणाम अभी भी वही है।
डेनियल श्वेतलोव

जवाबों:


37

तत्परता प्रोटोकॉल बेमेल

जैसा कि विलैंड ने कहा, Typeसेवा का महत्व महत्वपूर्ण है। यह सेटिंग बताता है कि किस तत्परता प्रोटोकॉल सिस्टमड को सेवा से बोलने की उम्मीद है। एक simpleसेवा को तुरंत तैयार मान लिया गया है। एक forkingप्रारंभिक प्रक्रिया के लिए तैयार होने के बाद एक बच्चा लेने के लिए एक सेवा ली जाती है और फिर बाहर निकल जाती है। एक dbusसेवा है जब एक सर्वर डेस्कटॉप बस पर दिखाई देता है तैयार होने के लिए लिया जाता है। इत्यादि।

यदि आपको सेवा इकाई में घोषित तत्परता प्रोटोकॉल नहीं मिलता है कि सेवा क्या करती है, तो चीजें गड़बड़ हो जाती हैं। रीडायरेक्ट प्रोटोकॉल मिसमैच की वजह से सेवाएं सही तरीके से शुरू नहीं हो पाती हैं, या (आमतौर पर) सिस्टम द्वारा फेल होने का गलत (गलत) निदान किया जाता है। जब किसी सेवा को सिस्टम शुरू करने में विफल होने के रूप में देखा जाता है, तो यह सुनिश्चित करता है कि सेवा की प्रत्येक अनाथ अतिरिक्त प्रक्रिया जिसे विफलता के भाग के रूप में छोड़ दिया गया हो (सेवा के दृष्टिकोण से) सेवा को ठीक से निष्क्रिय करने के लिए उसे मार दिया जाता है। राज्य।

आप बिल्कुल यही कर रहे हैं।

सबसे पहले, साधारण सामान: sh -cमेल नहीं खाता Type=simpleया Type=forking

में simpleप्रोटोकॉल, प्रारंभिक प्रक्रिया के लिए लिया जाता है हो सकता है सेवा प्रक्रिया। लेकिन वास्तव में एक sh -cआवरण एक बच्चे की प्रक्रिया के रूप में वास्तविक सेवा कार्यक्रम चलाता है । तो MAINPIDगलत ExecReloadहो जाता है और काम करना बंद कर देता है, शुरुआत के लिए। उपयोग करते समय Type=simple, किसी को पहली जगह का उपयोग करना चाहिए sh -c 'exec …'या नहीं करना चाहिए sh -c। उत्तरार्द्ध कुछ लोगों को लगता है कि अधिक बार सही पाठ्यक्रम है।

sh -cType=forkingया तो मेल नहीं खाता । एक forkingसेवा के लिए तत्परता प्रोटोकॉल काफी विशिष्ट है। प्रारंभिक प्रक्रिया में एक बच्चे को कांटा जाता है, और फिर बाहर निकल जाता है। systemd इस प्रोटोकॉल के लिए एक समय सीमा लागू करता है। यदि प्रारंभिक प्रक्रिया आवंटित समय के भीतर कांटा नहीं करती है, तो यह तैयार होने में विफलता है। यदि प्रारंभिक प्रक्रिया आवंटित समय के भीतर नहीं निकलती है, तो वह भी विफलता है।

अनावश्यक आतंक है ossec-control

जो हमें जटिल चीज़ों की ओर ले जाता है: वह ossec-controlस्क्रिप्ट।

यह पता चला है कि यह एक सिस्टम 5 rcस्क्रिप्ट है जो 4 और 10 प्रक्रियाओं के बीच बंद है, जो खुद अपनी बारी कांटा और बाहर भी निकलता है। यह उन सिस्टम 5 rcस्क्रिप्टों में से एक है जो एक एकल स्क्रिप्ट में सर्वर प्रक्रियाओं के एक पूरे सेट को प्रबंधित करने का प्रयास करता है, forछोरों, दौड़ की स्थिति के साथ, sleepउनसे बचने की कोशिश करने के लिए मनमाने ढंग से एस, विफलता मोड जो सिस्टम को आधे-अधूरे स्थिति में चोक कर सकते हैं, और अन्य सभी भयावहताएं जो लोगों को दो दशक पहले एआईएक्स सिस्टम रिसोर्स कंट्रोलर और डेमोंटोल्स जैसी चीजों का आविष्कार करने के लिए मिलीं। और आइए एक द्विआधारी निर्देशिका में छिपी शेल स्क्रिप्ट को न भूलें जो इसे मक्खी पर फिर से लिखती है, आइडिओसिंक्रोनैटिक enableऔर disableक्रियाओं को लागू करने के लिए ।

तो जब आप /bin/sh -c '/var/ossec/bin/ossec-control start'क्या होता है:

  1. systemd कांटे जो यह सेवा प्रक्रिया होने की उम्मीद करता है।
  2. वह खोल है, जो कांटे ossec-control
  3. बदले में 4 और 10 पोते के बीच कांटे।
  4. पोते सभी कांटे और बदले में बाहर निकलते हैं।
  5. महान-पोते सभी कांटे और समानांतर में बाहर निकलते हैं।
  6. ossec-control बाहर निकलता है।
  7. पहला खोल बाहर निकलता है।
  8. सेवा प्रक्रियाओं थे महान-महान पोते, लेकिन क्योंकि काम कर रहे मैचों में से इस तरह से न तो forking है और न हीsimple तत्परता प्रोटोकॉल, systemd एक पूरे के रूप में मानता है सेवा में विफल रहा है और बन्द हो जाता है की है, यह वापस नीचे।

इस हॉरर में से कोई भी वास्तव में सिस्टमड के तहत बिल्कुल भी आवश्यक नहीं है। इसमें से कोई नहीं।

एक systemd टेम्पलेट सेवा इकाई

इसके बजाय, एक बहुत ही सरल टेम्पलेट इकाई लिखता है :

[यूनिट]
विवरण = OSSEC HIDS% i सर्वर
= Network.target के बाद 

[सेवा]
प्रकार = सरल
ExecStartPre = / usr / bin / env / var / ossec / bin /% p-% i -t
ExecStart = / usr / bin / env / var / ossec / bin /% p-% i -f

[इंस्टॉल]
WantedBy = multi-user.target

इसे इस रूप में सहेजें /etc/systemd/system/ossec@.service

विभिन्न वास्तविक सेवाएं इस टेम्प्लेट की तात्कालिकता हैं , जिसका नाम है:

  • ossec@dbd.service
  • ossec@agentlessd.service
  • ossec@csyslogd.service
  • ossec@execd.service
  • ossec@agentd.service
  • ossec@logcollector.service
  • ossec@syscheckd.service
  • ossec@maild.service
  • ossec@analysisd.service
  • ossec@remoted.service
  • ossec@monitord.service

फिर सक्षम और अक्षम फ़ंक्शन सीधे सेवा प्रबंधन प्रणाली ( रेडहैट बग 752774 फिक्स्ड के साथ) से आता है, जिसमें छिपी शेल स्क्रिप्ट की कोई आवश्यकता नहीं है।

 systemctl सक्षम करें ossec @ dbd ossec @ agentlessd ossec @ csyslogd ossec @ maild ossec @ execd ossec @ analysisd ossec @ logcollector ossec / प्रेषित ossec @ syscheckd ossec @ monitord

इसके अलावा, systemd को प्रत्येक वास्तविक सेवा को सीधे ट्रैक करने और ट्रैक करने के बारे में पता चलता है। यह उनके लॉग को फ़िल्टर कर सकता है journalctl -u। यह पता चल सकता है कि कोई व्यक्तिगत सेवा कब विफल हो गई। यह जानता है कि किन सेवाओं को सक्षम और चालू करना चाहिए।

वैसे: Type=simpleऔर -fविकल्प यहीं हैं क्योंकि वे कई अन्य मामलों में हैं। जंगली में बहुत कम सेवाएँ वास्तव में उनकी तत्परता को इंगित करती हैं exit, और ये ऐसे मामले भी नहीं हैं। लेकिन यही forkingप्रकार का मतलब है। मुख्य बस कांटे में जंगली में सेवाएं और कुछ गलती की वजह से बाहर निकलना ज्ञान धारणा है कि यही dæmons करने वाले हैं। वास्तव में, यह नहीं है। यह 1990 के दशक से नहीं है। यह पकड़ने का समय है।

आगे की पढाई


2
बहुत विस्तृत जवाब! मैं भी एक "समूहीकरण" लक्ष्य बनाने का सुझाव देता हूं, कहते हैं, ossec.target, जो Requires=सभी आवश्यक उदाहरण हैं, और फिर PartOf=ossec.targetossec @ .service में सेट किया गया है। यह ossec.target को शुरू और बंद करके ossec को शुरू करने और रोकने की अनुमति देगा।
intelfx

@ जेडेबीपी, वाह! इस तरह के विस्तृत जवाब के लिए बहुत बहुत धन्यवाद। आशा है कि मैं इस इकाई को बनाऊंगा और परिणामों के बारे में यहां लिखूंगा। मैं हालांकि था, कि मैं आसान हो जाएगा। लेकिन आप सही हैं, ossec- नियंत्रक एक नरक नरक है।
डेनियल श्वेतलोव

1
एक आवरण के रूप में / usr / bin / env का उपयोग करने का कारण क्या है?
मारियस गेदमिनस

1

टाइप करें = फोर्किंग करें और एक पीआईडी ​​फाइल लोकेशन दें, यदि सर्विस / एप किसी भी पिड को मेंटेन कर रहा है।

[यूनिट]
विवरण = "बूट पर रन ऐप" के
बाद = network.target syslog.target ऑडिट.स्वाइस

[सेवा]
टाइप करें = forking
PIDFile = / var / run / apache2 / apache2.pid
ExexStart = / etc / init.d / apache2 शुरू
ExecStop = / etc / init.d / apache2 रोक
StandardOutput = syslog
StandardError = syslog
पुनरारंभ = ऑन-विफलता
SyslogIdentifier = webappslog

[स्थापित]
WantedBy = multi-user.target
उर्फ = webapps


0

कुछ हद तक संबंधित, मेरे पास एक प्रणाली सेवा थी जो यह दिखाई देती थी कि 30 के बाद यह सिस्टमड इसे "मार" देगा।

systemctl status service-namemain process exited, code=exited, status=1/FAILURE30s बीत जाने के बाद दिखाएगा ।

यह "आइसोलेशन" में ठीक चलेगा (जैसे कि उसी वातावरण के साथ टर्मिनल में मैन्युअल रूप से )।

यह पता चला था

Type=forking
...
Environment=ABC="TRUE"
ExecStart=/path/to/my_script_to_spawn_process.sh

भीतर my_script_to_spawn_process.shयह कर रहा था

/bin/something > /dev/null 2>&1 &

जो काम करता है लेकिन आउटपुट लॉग जानकारी को खारिज कर रहा था (आम तौर पर यह फ़ाइल में जाता है, या, यदि ऐसा नहीं है, तो संभवतः journalctl)।

इसे बदलने के लिए जैसे कहीं और लॉग इन करना है /bin/something > /tmp/my_file

तब /tmp/my_fileवास्तविक कारण का खुलासा किया। जो था (tangentially) जो आप वाक्य रचना का उपयोग नहीं कर सकते Environment=ABC="true"जैसे कि आप कर सकते हैं, यह कोई उद्धरण या उद्धरण के भीतर सभी प्रमुख मूल्य होना चाहिए, जैसे Environment="ABC=true"कि मेरी प्रक्रिया "इसके सेटअप चरण में" से बाहर निकलने का कारण बन रहा था "लगभग 30 के बाद"।


-4

ध्यान दें कि systemd का डेमन मॉडल कई मौजूदा डेमॉन के साथ सरल और असंगत है जो कई फोर्किंग, एक्ज़ीक्यूटिंग और सेतुइडिंग करते हैं। सबसे आम हैं डेमॉन जो चीजों को सेट करने के लिए रूट के रूप में शुरू करते हैं और फिर रूटीन ऑपरेशन के लिए कम विशेषाधिकार प्राप्त यूआईडी पर स्विच करते हैं। उदाहरण के लिए Pid फ़ाइल आरंभीकरण एक ऐसी चीज़ है जो विशेषाधिकार संबंधी समस्याओं के कारण सिस्टमड के अंतर्गत विफल हो जाती है। वर्कअराउंड (फिक्स नहीं) हैं, लेकिन यह बुरी तरह से प्रलेखित है।

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


1
वैसे भी पीआईडी ​​फाइलें क्या हैं? यदि कोई दी गई सेवा के लिए मौजूद है, तो उस PID के साथ कोई वास्तविक प्रक्रिया हो सकती है या नहीं भी हो सकती है, और जब PID के साथ कोई प्रक्रिया मौजूद होती है, तो यह वास्तव में अपेक्षित सेवा हो भी सकती है और नहीं भी।
JoostM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.