CentOS 7 बूट बहुत तेज़ और नेटवर्क है जो क्रोन स्क्रिप्ट्स को निष्पादित करते समय तैयार नहीं है


9

मैंने अभी सेंटोस 6.5 से 7.0 तक अपग्रेड किया है और मैं बहुत खुश नहीं हूं क्योंकि नया systemdशायद मुझे समस्याएं दे रहा है। ऐसा लगता है कि यह बस बहुत तेजी से बूट हो रहा है, अतुल्यकालिक रूप से प्रक्रिया शुरू कर रहा है और सेवा निर्भरता को खराब कर रहा है।

उदाहरण के लिए मेरे पास कुछ स्क्रिप्ट सेटअप हैं crondजिनमें एक रिबूट के बाद ट्रिगर किया गया है:

@reboot    /root/scripts/check_gmail.sh
@reboot    /root/scripts/start_gps_listener.sh

यह सभी प्रकार की अजीब त्रुटियों का परिणाम है (केवल उनमें से एक दिखा रहा है):

Warning: stream_socket_client(): unable to connect to tcp://192.168.20.4:4001 
  (Network is unreachable) in /root/scripts/check_gmail.php on line 137
  ERROR: Network is unreachable (101)

ऊपर में मैं एक टीसीपी सॉकेट लिख रहा हूं। यह मेरे लिए बहुत स्पष्ट है कि crondनेटवर्क ठीक से शुरू होने से पहले शुरू किया गया है network is unreachable

यही बात Apache और MySQL (MariaDB) के साथ भी जाती है। MySQL स्टार्टअप (बहुत अधिक डेटा) के लिए काफी धीमा है, जिसका अर्थ है कि Apache और मेरे crondस्टार्टअप स्क्रिप्ट के बहुत सारे विफल हो रहे हैं क्योंकि स्क्रिप्ट को कॉल किए जाने पर MySQL डेटाबेस नहीं चल रहा है।

मैंने निर्भरता को स्थापित करने की कोशिश की है, लेकिन बिना किसी भाग्य के; मैं संलग्न है networkऔर mysqlसेवाओं [Unit](के रूप में साथ देखा systemctl list-dependencies)। आदर्श रूप से MySQL के उठने और चलने तक सभी सेवाएँ प्रतीक्षा करती हैं:

vi /lib/systemd/system/httpd.service
  [Unit]
  Description=The Apache HTTP Server
  After=network.target remote-fs.target nss-lookup.target network.service mysql.service

vi /lib/systemd/system/crond.service
  [Unit]
  Description=Command Scheduler
  After=syslog.target auditd.service systemd-user-sessions.service time-sync.target network.service mysql.service

ऊपर से बूट करने पर मुझे वही त्रुटियां मिलती हैं। मुझे ईमेल भी मिलते हैं mailqक्योंकि क्रोन-स्क्रिप्ट को संसाधित करते समय नेटवर्क / DNS तैयार नहीं होता है। स्टार्टअप के कुछ मिनट बाद उन्हें सही तरीके से भेजा जाता है।

क्या कोई यह सुनिश्चित करने में मदद कर सकता है कि सेवाओं को सही क्रम में निकाल दिया गया है? यह बहुत गलत लगता है कि यह बहुत तेज़ बूटिंग है और आदर्श रूप से यह अच्छा पुराना तरीका है, "एक सेरिस को लॉन्च करना ... प्रतीक्षा करना ... एक नई सेवा शुरू करना ... प्रतीक्षा करना ... इत्यादि।"

ध्यान दें कि मुझे यकीन नहीं है systemdकि यह मेरी समस्या है - यह सिर्फ मेरा सिद्धांत है कि मैं नेट से क्या पढ़ सकता हूं।


क्या आप का आउटपुट पोस्ट कर सकते हैं grep -i concurrency /etc/default/rcS? मैं अपने init सिस्टम को मिक्स कर सकता हूं, लेकिन मुझे याद है कि यह नियंत्रित करता है कि क्या प्रक्रियाएं एक दूसरे के खत्म होने का इंतजार करती हैं।
टेराडो

मेरे पास कोई फाइल नहीं है/etc/default/rc*
DHS

क्षमा करें, मुझे नहीं पता कि CentOS समकक्ष कहाँ होगा। मैं सोच रहा था कि डेबियन के लिए यहां क्या वर्णित है , जो सेवाओं को समानांतर में शुरू करता है। आपके मामले में कुछ इसी तरह का सेट हो सकता है।
terdon

2
Requires=network.targetउपरोक्त इकाइयों को जोड़ने का प्रयास करें ।
केसी

फिर भी एक ही समस्या डाला के बाद Requires=network.targetकरने के लिए/lib/systemd/system/crond.service
DHS

जवाबों:


10

बहुत अधिक पढ़ने के बाद मुझे वह समाधान मिला जो मेरे लिए काम करता है।

मैं इस गाइड को पढ़ रहा हूं, नेटवर्क के उठने के बाद रनिंग सर्विसेज । गाइड से थोड़ा उद्धरण:

यह सुनिश्चित करेगा कि सभी कॉन्फ़िगर किए गए नेटवर्क डिवाइस ऊपर हैं और बूट जारी होने से पहले एक आईपी पता सौंपा गया है।

यह वही है जो मैं चाहता था इसलिए मैंने इस सेवा को सक्षम किया और इसके लिए सेवा फ़ाइल में एक निर्भरता नियम निर्धारित किया crond:

[root@srv]# systemctl enable NetworkManager-wait-online

[root@srv]# vi /lib/systemd/system/crond.service
  Requires=network.target
  After=syslog.target auditd.service systemd-user-sessions.service time-sync.target network.target mysqld.service

जैसा mysqldकि अभी भी पुराने के आधार पर init.dमुझे एक systemdसेवा बनाने की आवश्यकता है जैसा कि यहां सुझाया गया है, सिस्टमैक्टल सक्षम से शुरू होता है :

[root@srv]# vi /lib/systemd/system/mysqld.service
  [Unit]
  Description=MySQL Server
  After=network.target
  [Service]
  Type=forking
  ExecStart=/etc/rc.d/init.d/mysql start
  ExecStop=/etc/rc.d/init.d/mysql stop
  [Install]
  WantedBy=multi-user.target

[root@srv]# systemctl daemon-reload
[root@srv]# chkconfig mysql off
[root@srv]# systemctl enable mysqld

और अंत में MySQL के बाद Apache सर्विस को स्टार्टअप पर सेट करें :

[root@srv]# vi /lib/systemd/system/httpd.service
  Requires=mysqld.service
  After=network.target remote-fs.target nss-lookup.target mysqld.service

यह मेरे लिए कम से कम काम करता है।

मैंने इन कमांड का उपयोग इसके बाद जांचने के लिए किया है, जहां मैं स्पष्ट रूप से देख सकता हूं कि कम से कम MySQL और Apache से पहले नेटवर्क शुरू हो गया है। हालांकि मैं crondकहीं भी नहीं देख सकता, लेकिन मैं देख सकता हूं कि यह मेरी स्क्रिप्ट में काम कर रहा है:

[root@srv]# systemd-analyze critical-chain
  multi-user.target @10.510s
    + httpd.service @10.344s +165ms
      + mysqld.service @9.277s +1.065s
        + network.target @9.273s
          + network.service @8.917s +355ms
            + iptables.service @444ms +157ms
              + basic.target @443ms
                [CUT]

मेरे द्वारा उपयोग की जाने वाली अन्य उपयोगी कमांड के कुछ जोड़े हैं:

# See exactly what takes how long (who to blame for the delay)
[root@srv]# systemd-analyze blame

# Check available names that can be used in the service files
[root@srv]# systemctl list-unit-files

यदि कोई भी ऐसा करने का कोई बेहतर तरीका देख सकता है तो कृपया साझा करें।


+1 यह कमांड जो आपने डीबग करने के लिए उपयोग किया था को पोस्ट करने के लिए। मैं समस्याओं का एक बहुत बुरा गाँठ हल करने में सक्षम था systemd-analyze critical-chain। न केवल मैं अक्सर उपयोग करने जा रहा हूं, लेकिन मैं अचानक बेच दिया गया हूं systemd। धन्यवाद!
ब्रायन टॉपिंग

आपको अपने वितरण पैकेज प्रबंधक द्वारा प्रबंधित सेवाओं की फाइलों को संशोधित नहीं करना चाहिए। इसके बजाय आप ड्रॉप-इन कॉन्फ़िगरेशन फ़ाइलों का बेहतर उपयोग करेंगे। उत्तर देखें कि मैं सिस्टमड सेवाओं
लुडोविक राइडर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.