วิธีการเปลี่ยนค่าการหมดเวลาบริการ systemd?


33

ใน บริษัท ที่ฉันทำงานอยู่ตอนนี้มีบริการแบบดั้งเดิมและสคริปต์เริ่มต้นของมันกำลังใช้ SysvInit รุ่นเก่า แต่ทำงานผ่าน systemd (CentOS 7)

เนื่องจากมีการคำนวณจำนวนมากบริการนี้ใช้เวลาประมาณ 70 วินาทีจึงจะเสร็จสิ้น ฉันไม่ได้กำหนดค่าการหมดเวลาสำหรับ systemd และไม่เปลี่ยนการกำหนดค่าเริ่มต้นที่/etc/systemd/system.confแต่เมื่อฉันเรียกใช้service SERVICE stopบริการของฉันหมดเวลาหลังจาก 60 วินาที

ตรวจสอบกับjournalctl -b -u SERVICE.serviceฉันพบบันทึกนี้:

Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]

ฉันได้ลองเปลี่ยนDefaultTimeoutStopSecคุณสมบัติ/etc/systemd/system.confเป็น90sเป็น แต่การหมดเวลายังคงเกิดขึ้น

ไม่มีใครมีความคิดใด ๆ ว่าทำไมถึงหมดเวลาที่ 60s? มีที่ไหนอีกบ้างที่มีการกำหนดค่าการหมดเวลานี้ มีวิธีที่ฉันสามารถตรวจสอบได้หรือไม่

บริการนี้จะทำงานด้วย java 7 และ daemonize มันใช้JSVC ผมกำหนดค่าพารามิเตอร์ที่มีค่า-wait120

คำตอบ:


54

บริการ systemd ของฉันยังคงหมดเวลาเพราะต้องใช้เวลาในการบู๊ตนานเท่าใดดังนั้นสิ่งนี้จึงทำให้ฉัน:

  1. แก้ไขไฟล์ systemd ของคุณ:
    • สำหรับรุ่นปัจจุบันsystemd : Run systemctl edit --full node.service(แทนที่ "node" ด้วยชื่อบริการของคุณ )
      • นี้จะสร้างไฟล์ระบบที่ว่าจะแทนที่ระบบแฟ้มที่/etc/systemd/system/node.service.d/ /usr/lib/systemd/system/node.serviceนี่เป็นวิธีที่เหมาะสมในการกำหนดค่าไฟล์ระบบของคุณ ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการที่จะใช้systemctl editเป็นที่นี่
    • โดยตรงแก้ไขไฟล์ระบบ : /usr/lib/systemd/system/node.serviceแฟ้มระบบสำหรับฉันก็คือที่ แทนที่ "node" ด้วยชื่อแอปพลิเคชันของคุณ อย่างไรก็ตามมันไม่ปลอดภัยที่จะแก้ไขไฟล์โดยตรง/usr/lib/systemd/(ดูความคิดเห็น)
  2. การใช้งานTimeoutStartSec, TimeoutStopSecหรือTimeoutSec(ข้อมูลเพิ่มเติมที่นี่ ) เพื่อระบุว่าระยะเวลาที่หมดเวลาที่ควรจะเป็นสำหรับการเริ่มต้นและหยุดกระบวนการ หลังจากนั้นไฟล์ของฉันจะเป็นอย่างไร

    [Unit]
    Description=MyProject
    Documentation=man:node(1)
    After=rc-local.service
    
    [Service]
    WorkingDirectory=/home/myproject/GUIServer/Server/
    Environment="NODE_PATH=/usr/lib/node_modules"
    ExecStart=-/usr/bin/node Index.js
    Type=simple
    Restart=always
    KillMode=process
    TimeoutSec=900
    
    [Install]
    WantedBy=multi-user.target
    
    • คุณสามารถดูสถานะการหมดเวลาปัจจุบันได้ด้วยการเรียกใช้งานใด ๆ เหล่านี้ (แต่คุณจะต้องแก้ไขบริการของคุณเพื่อทำการเปลี่ยนแปลง! ดูขั้นตอนที่ 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. ต่อไปคุณจะต้องโหลดระบบอีกครั้งด้วย systemctl reload node.service
  4. ตอนนี้ลองเริ่มบริการของคุณด้วย systemctl start node.service
  5. หากไม่ได้ผลให้ลองรีบูตระบบด้วยsystemctl reboot
  6. หากที่ไม่ได้ทำงานให้ลองใช้--no-blockตัวเลือกสำหรับการ systemctl systemctl --no-block start node.serviceชอบโดย: ตัวเลือกนี้อธิบายไว้ที่นี่ : "อย่ารอให้การดำเนินการที่ร้องขอเสร็จสิ้นหากไม่ได้ระบุไว้งานจะได้รับการตรวจสอบจัดคิวและ systemctl จะรอจนกว่าการเริ่มต้นของหน่วยจะเสร็จสมบูรณ์ ได้รับการยืนยันและลงทะเบียนเท่านั้น "
    • นอกจากนี้ยังมีตัวเลือกที่จะใช้แทนsystemctl mask systemctl startสำหรับข้อมูลเพิ่มเติมโปรดดูที่นี่

อัปเดตจากความคิดเห็น:

  • TimeoutSec=infinity: แทนที่จะใช้ "อนันต์" ที่นี่ให้ใช้เวลานานแทนเช่นTimeoutSec=900(15 นาที) หากแอปพลิเคชันใช้ "ตลอดไป" เพื่อออกจากนั้นเป็นไปได้ว่ามันจะปิดกั้นการรีบูตโดยไม่มีกำหนด เครดิต @Alexis Wilke และ @JCCyC
  • แทนที่จะแก้ไข/usr/lib/systemd/systemลองsystemctl editแทนหรือแก้ไข/etc/systemd/systemเพื่อแทนที่พวกเขาแทน /usr/lib/คุณไม่ควรแก้ไขไฟล์ให้บริการใน เครดิต @ryeager และ @ 0xC0000022L

8
TimeoutSec=infinity- เป็นไปได้ไหมที่บล็อกนี้จะรีบูตโดยไม่มีกำหนด? จะเป็นอย่างไรถ้าใช้ "ตลอดไป" เพื่อให้กระบวนการออก ผมขอแนะนำให้เป็นจำนวนมากเช่น5minแต่อาจจะไม่ได้infinity...
อเล็กซิส Wilke

6
คุณไม่ควรแก้ไขไฟล์บริการใน / usr / lib คุณควรแก้ไขหรือแทนที่พวกเขาใน / etc / systemd / system
ryeager

5
ในขณะที่ส่วนสำคัญของคำแนะนำคือเสียงฉันต้องเห็นด้วยกับ @ryeager ... systemdข้อเสนอรุ่นใหม่systemctl edit(และmaskเพื่อปิดการใช้งานด้วยกำลังดุร้ายเมื่อเทียบกับdisable) เพื่อจุดประสงค์นั้น /usr/lib/systemdคุณไม่ควรแก้ไขไฟล์ใน
0xC0000022L

3
TimeoutSec=infinityไม่ได้ทำงานที่นี่ฉันใช้TimeOutSec=900(15 นาที) และนั่นช่วยฉันไว้ข้างหลัง - ฉันจำเป็นต้องเรียกใช้systemctl daemon-reloadหลังจากนั้นก่อนที่จะเริ่มบริการใหม่
JCCyC

10

ทำงานsystemctl show SERVICE_NAME.service -p TimeoutStopUSecอย่างน้อยที่สุดฉันจะเห็นการหมดเวลาที่กำหนดโดย systemd ไปยังบริการของฉัน

ฉันเปลี่ยนสคริปต์เป็นไฟล์หน่วยปกติหนึ่งไฟล์เพื่อให้ทำงานได้อย่างถูกต้อง

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