วิธีที่ดีที่สุดที่จะทำให้เบ็ดปิด?


9

ตั้งแต่ Ubuntu พึ่งใช้ช่วงเวลาหนึ่งตอนนี้ฉันต้องการใช้งานพุ่งพรวดเพื่อปิดแอพพลิเคชั่นบางอย่างอย่างสง่างามในการปิดระบบหรือรีบูต จำเป็นอย่างยิ่งที่การปิดระบบหรือการรีบูตจะหยุดทำงานจนกว่าแอปพลิเคชันเหล่านี้จะปิดตัวลง

แอปพลิเคชั่นจะเริ่มต้นเองในบางโอกาสและเมื่อการปิดระบบควรจบลงโดยอัตโนมัติด้วยสคริปต์ (ซึ่งฉันมีอยู่แล้ว) เนื่องจากแอปพลิเคชั่นไม่สามารถสิ้นสุดได้อย่างน่าเชื่อถือหากไม่มีบริการอื่น ๆ (เกือบทั้งหมด) ที่ทำงานอยู่ดังนั้นการปิดแอปพลิเคชันจึงต้องทำก่อนที่จะปิดการทำงานส่วนที่เหลือ

ฉันคิดว่าฉันสามารถแก้ปัญหานี้ได้โดยงานที่พุ่งพรวดซึ่งจะถูกเรียกใช้เมื่อปิดเครื่อง แต่ฉันไม่แน่ใจว่าควรใช้เหตุการณ์ใดในลักษณะที่ จนถึงตอนนี้ฉันได้อ่านข้อความต่อไปนี้ (ขัดแย้งบางส่วน):

  • ไม่มีเหตุการณ์การปิดระบบทั่วไปในการพุ่งพรวด
  • ใช้ stanza เหมือนstart on starting shutdownในคำจำกัดความงาน
  • ใช้ stanza เหมือนstart on runlevel [06S]ในคำจำกัดความงาน
  • ใช้ stanza เหมือนstart on starting runlevel [06S]ในคำจำกัดความงาน
  • ใช้ stanza เหมือนstart on stopping runlevel [!06S]ในคำจำกัดความงาน

จากคำแนะนำเหล่านี้คำถามต่อไปนี้จะเกิดขึ้น:

  • มีหรือไม่มีเหตุการณ์การปิดระบบทั่วไปในการพุ่งพรวดของ Ubuntu หรือไม่?
  • อะไรคือวิธีที่แนะนำในการติดตั้ง "hook shutdown"?
  • เมื่อใดที่เหตุการณ์ runlevel [x] ถูกทริกเกอร์; นี่คือเมื่อเข้าสู่ runlevel หรือเมื่อเข้าสู่ runlevel?
  • เราสามารถใช้สิ่งที่ชอบstart on starting runlevel [x]หรือstart on stopping runlevel [x]ไม่?
  • อะไรจะเป็นทางออกที่ดีที่สุดสำหรับปัญหาของฉัน

ขอบคุณมาก

คำตอบ:


2

startingและเป็นเหตุการณ์ที่แยกจากกันเพื่อให้คุณไม่สามารถมีความหมายบอกว่าrunlevelstarting runlevel N

runlevel Nเหตุการณ์ถูกปล่อยออกมาในช่วงเริ่มต้นของการเข้าสู่ระดับการทำงานที่ หากคุณstart on runlevel Nแล้วงานของคุณทำงานในรายการ run on started rc RUNLEVEL=Nวิธีการทำงานเมื่อเข้าสู่ระดับการทำงานจะเสร็จสมบูรณ์คือ

ตามที่ฉันเข้าใจคุณต้องstart on runlevel [06S]ทำสิ่งที่คุณต้องการ ในทางทฤษฎีควรจะทำงานก่อนที่จะหยุดสิ่งอื่นใด สำหรับการควบคุมที่ละเอียดกว่านี้คุณอาจใช้start on stopping apache or stopping mysql or ...เพื่อให้งานของคุณทำงานก่อนที่จะอนุญาตให้ปิดได้


แก้ไขเพื่อเปลี่ยน runlevel 5 เป็น S


1
นอกจากนี้เหตุผลเดียวที่มีstartupเหตุการณ์ที่แตกต่างคือสิ่งที่จำเป็นสำหรับ "ปั๊มหลัก" startupหลังจากนั้นเหตุการณ์หนึ่งที่ได้รับการยกเว้นจะถูกส่งไปทุกอย่างอื่นสามารถและเป็นที่กำหนดโดยงานและงานเรียกโดย สำหรับการที่ไม่มีshutdownเหตุการณ์เดียวมีหลายประเภทshutdownที่มีความหมาย ดีกว่าที่จะพึ่งพางานที่คุณต้องการโดยตรง
geekosaur

ขอบคุณมาก. ฉันยินดีรับการตอบกลับของคุณอย่างสุดซึ้งเพราะมันตอบคำถามของฉันและแก้ปัญหาได้ อย่างไรก็ตามฉันมีคำถาม / ความคิดเห็นเพิ่มเติม (ซึ่งไม่เกี่ยวข้องกับปัญหา): AFAIK เป็นเป้าหมายสูงสุดของการแทนที่แนวคิด runlevel อย่างสมบูรณ์ ความจริงที่ว่าเราต้องพึ่งพา runlevels เพื่อให้ระบบปิดการขายทั่วโลกขัดกับเป้าหมายนี้ ฉันคิดว่าคนธรรมดาจะต้องแนะนำเหตุการณ์เช่นนี้ ฉันเข้าใจชัดเจนว่ามันจะดีกว่าที่จะขึ้นอยู่กับงานที่เราต้องการจริงๆ แต่ในทางกลับกันในกรณีของฉันมันเป็นงานที่เต็มไปหมด ... ต่อไป ...
Binarus

(เกือบทุกอย่างที่กำลังทำงานอยู่) และฉันก็ไม่กล้าที่จะคิดหาความสัมพันธ์ระหว่างกระบวนการที่ทำงานอยู่บนกล่อง (ps -Alf) และงานที่กำลังควบคุมกระบวนการเหล่านี้ แน่นอนว่าไม่มีความสัมพันธ์แบบ 1: 1 มีงานที่ไม่เกี่ยวข้องกับกระบวนการใด ๆ (ตัวอย่างเช่นการกำหนดค่าเครือข่าย) และฉันคิดว่ามีกระบวนการเพียงพอที่ไม่เกี่ยวข้องกับงานอยู่แล้วและโดยเฉพาะอย่างยิ่งเมื่อเริ่มสิ่งต่าง ๆ ด้วยตนเอง
Oli

พุ่งพรวดเข้ามาแทนที่hardcoded runlevels; เท่าที่ฉันสามารถระบุได้แนวคิด runlevel จะไม่หายไปมันเพิ่งถูกกำหนดใน userspace ทันที หากคุณกังวลเกี่ยวกับระยะยาวเช่นนี้คุณต้องการใช้คำแนะนำสุดท้ายของฉันในการทำงานกับon stopping servicea or stoping serviceb or ...บริการใดก็ตามที่คุณต้องการใช้งาน
geekosaur

-1 สำหรับความไม่ถูกต้องหลายอย่าง แบนออกนี่จะไม่ได้ผลจริง stop on start rc RUNLEVEL = [016] ไม่แตกต่างกัน 'หยุดที่ runlevel [016]' นี่เป็นเพราะไม่มีเหตุการณ์ใด ๆ ที่จะปิดกั้นไม่ให้ดำเนินการต่อ นอกจากนี้ยังมีไวยากรณ์ที่ไม่ถูกต้องเนื่องจาก 'run on' ไม่ถูกต้อง สรุปทั้งหมดนี้ทำให้เกิดความสับสน แต่ก็ไม่ได้ช่วยอะไร ขออภัยที่มาสาย! เพียงแค่ทบทวนคำตอบเก่า ๆ
SpamapS

2

เพื่อหยุดการปิดระบบไม่ให้ดำเนินการต่อในขณะที่งานหยุดคุณจะต้องใช้สิ่งนี้:

stop on starting rc RUNLEVEL=[016]

สิ่งนี้จะทำงานได้เพราะสิ่งแรกที่เกิดขึ้นเมื่อคุณพิมพ์ 'shutdown' คือ tunlevel 0 ถูกปล่อยออกมา rc เริ่มทำงานบน runlevel และการเปลี่ยนจากหยุด -> การเริ่มต้นจะปิดกั้นอย่างสมบูรณ์จนกระทั่งงานใด ๆ ที่ต้องเปลี่ยนสถานะทำสถานะนั้นให้สมบูรณ์

คุณจะต้องแน่ใจว่ากระบวนการของคุณตอบสนองต่อ SIGTERM อย่างรวดเร็ว หากไม่ตอบสนองภายใน 5 วินาทีคนธรรมดาจะส่ง SIGKILL คุณสามารถยกระดับนั้นด้วย 'kill timeout X'

1 ในนั้น btw ค่อนข้างยุ่งยากคุณต้องตรวจสอบให้แน่ใจว่าการเริ่มต้นของคุณมีบางสิ่งที่เริ่มต้นใน runlevel [2345] ณ จุดนั้นเพื่อให้ผู้ใช้ลงไปสำหรับการบำรุงรักษาโหมดผู้ใช้คนเดียว โชคดีที่มีงานจำนวนมากที่ทำให้สิ่งนี้เป็นการเริ่มต้นตามปกติที่แนะนำ

start on runlevel [2345]

ในบางกรณีคุณต้องมีบางสิ่งบางอย่างที่จะทำงานต่อไปจนกว่าเครือข่ายจะถูกลบ (เช่น dbus / network-manager) สำหรับสิ่งที่คุณต้องการ

stop on deconfiguring-networking

นั่นคือเหตุการณ์ที่ปล่อยออกมาภายหลังในการปิดระบบซึ่งจะถูกปิดกั้นจนกว่าจะมีงานใด ๆ ที่ใช้งานเสร็จสมบูรณ์ในช่วงการเปลี่ยนภาพในสถานะ


คุณหมายถึงว่าstart on starting ... มันไม่สมเหตุสมผลเลยที่จะหยุดการปิดระบบของฉันในทุกสิ่ง start on starting rc RUNLEVEL=[016]จะทำให้รู้สึกมากขึ้น และอาจมีการtaskโยนในที่นั่นเพื่อให้แน่ใจว่าจะสามารถดำเนินการก่อนที่สิ่งอื่น ๆ จะทำงาน
Tejay Cardon

0

Geekosaur ขอบคุณมากสำหรับความช่วยเหลือของคุณ

ในระหว่างนี้ฉันได้ลองstart on runlevel [016]วิธีการ แต่ก็ไม่ได้ผลและฉันคิดว่าฉันเข้าใจว่าทำไม:

งานได้รับการเริ่มต้นแน่นอน แต่กระบวนการปิดไม่ได้ถูกปิดกั้นจนกว่างานของงานจะเสร็จสิ้น ตอนนี้ฉันค่อนข้างแน่ใจว่าเหตุการณ์startingและstoppingเป็นเหตุการณ์เดียวที่สามารถใช้ในนิยามงานเพื่อบล็อกงานอื่น ๆ และฉันคิดว่านี่เป็นสิ่งที่คู่มือพุ่งพรวดพยายามบอกเรา ดังนั้นการใช้เหตุการณ์ runlevel จะไม่นำไปสู่การบล็อกงานอื่นหรือกระบวนการปิดระบบ ดังนั้นมันไร้ประโยชน์สำหรับจุดประสงค์ของฉัน

แต่ดูเหมือนว่าฉันมีความเป็นไปได้สองอย่าง:

  1. ทำตามข้อเสนอข้อใดข้อหนึ่งของคุณค้นหางานทั้งหมดที่แอปพลิเคชันที่ต้องการซ้ำและรวมงานทั้งหมดไว้ในเหตุการณ์เริ่มต้นสำหรับสคริปต์เช่นนั้น:

    start on stopping job1 or stopping job2 or ...
    

    นี่เป็นงานที่ฉันคิดอย่างจริงจังเกี่ยวกับการทิ้งรายการงานและเรียกใช้งานผ่าน sed เพื่อสร้าง stanza เริ่มต้นสำหรับงานของฉันโดยอัตโนมัติซึ่งรวมถึงงานทั้งหมดที่ปกติแล้วจะทำงานบนระบบ

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

  2. หางานที่จะหยุดในตอนแรกเมื่อรีบูต / ปิดระบบ (ขอเรียกงานนี้ว่า "FirstJob") และใช้งานนั้นในบทที่:

    start on stopping FirstJob
    

    ข้อเสียเปรียบหลักคือฉันไม่รู้ว่างานดังกล่าวมีอยู่จริงหรือไม่และงานนั้นขึ้นอยู่กับงานอื่นทั้งหมดซึ่งแอปพลิเคชันที่ใช้งานจริงขึ้นอยู่กับ ("ขึ้นอยู่กับงานอื่น" ในกรณีนี้หมายถึง "จะหยุด) สมบูรณ์ก่อนที่งานอื่นจะเริ่มหยุด ")

ฉันไม่แน่ใจว่าหนึ่งในสองสิ่งที่เป็นไปได้นั้นดีกว่า ...


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