CentOS 7 บู๊ตเร็วเกินไปและเครือข่ายไม่พร้อมใช้งานเมื่อรันสคริปต์ cron


9

ฉันเพิ่งอัพเกรดจาก CentOS 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)

ในข้างต้นฉันเขียนถึงซ็อกเก็ต TCP มันสวยชัดเจนกับผมว่าจะเริ่มต้นก่อนที่เครือข่ายจะเริ่มต้นได้อย่างถูกต้องเป็นcrondnetwork 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 ไม่พร้อมเมื่อประมวลผลสคริปต์ cron ไม่กี่นาทีหลังจากเริ่มต้นพวกเขาจะถูกส่งอย่างถูกต้อง

ทุกคนสามารถช่วยให้ได้รับสิทธินี้ด้วยการทำให้แน่ใจว่ามีการให้บริการตามลำดับที่ถูกต้อง? ดูเหมือนว่าผิดมากที่เป็นการบูทที่รวดเร็วและเป็นการดีที่ทำแบบเก่า "เปิดตัวเซริสหนึ่ง ... รอ ... เปิดตัวบริการใหม่ ... รอ ... ต่อไป)

โปรดทราบว่าฉันไม่แน่ใจsystemdว่าเป็นปัญหาของฉัน - มันเป็นเพียงทฤษฎีของฉันในสิ่งที่ฉันสามารถอ่านได้จากอินเทอร์เน็ต


คุณสามารถโพสต์การส่งออกของgrep -i concurrency /etc/default/rcS? ฉันอาจจะสับสนกับระบบเริ่มต้นของฉัน แต่ดูเหมือนว่าฉันจะจำได้ว่าการควบคุมนั้นกระบวนการจะรอให้กระบวนการอื่นเสร็จสิ้นหรือไม่
terdon

ฉันไม่มีไฟล์ด้วย/etc/default/rc*
DHS

ขออภัยฉันไม่ทราบว่า CentOS จะเทียบเท่ากับที่ไหน ฉันคิดถึงสิ่งที่อธิบายไว้ที่นี่สำหรับ Debian ซึ่งทำให้การบริการเริ่มต้นพร้อมกัน อาจมีบางสิ่งที่คล้ายกันในกรณีของคุณ
terdon

2
ลองเพิ่มRequires=network.targetลงในหน่วยงานด้านบน
casey

ยังคงเป็นปัญหาเดิมหลังจากใส่Requires=network.targetใน/lib/systemd/system/crond.service
DHS

คำตอบ:


10

หลังจากที่ได้อ่านมากขึ้นผมพบว่าวิธีการแก้ปัญหาที่ทำงานสำหรับฉัน

ผมอ่านคู่มือนี้เรียกใช้บริการหลังจากที่เครือข่ายขึ้น คำพูดเล็กน้อยจากคู่มือ:

สิ่งนี้จะช่วยให้มั่นใจได้ว่าอุปกรณ์เครือข่ายที่กำหนดค่าไว้ทั้งหมดนั้นมีการตั้งค่าและมีที่อยู่ IP ที่กำหนดไว้ก่อนที่จะทำการบู๊ตต่อไป

นี่คือสิ่งที่ฉันต้องการดังนั้นฉันจึงเปิดใช้งานบริการนี้และตั้งกฎการอ้างอิงในไฟล์บริการสำหรับ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บริการที่เป็นข้อเสนอแนะที่นี่systemctl เปิดการใช้งานที่แตกต่างจากการเริ่มต้น systemctl :

[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

และสุดท้ายตั้งค่าบริการ Apache ให้เริ่มต้นหลังจาก MySQL:

[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แต่ผมขายกะทันหัน ขอบคุณ!
Brian Topping

คุณไม่ควรแก้ไขไฟล์บริการที่จัดการโดยผู้จัดการแพ็คเกจการแจกจ่ายของคุณ คุณควรใช้ไฟล์กำหนดค่าแบบหล่นลงแทน ดูคำตอบของ ฉันจะแทนที่หรือกำหนดค่าบริการ systemd ได้อย่างไร?
Ludovic Ronsin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.