นี่คือคำสั่ง cr_restart ที่สามารถเรียกใช้ในผู้ให้บริการโฮสต์ฟรีของ OnWorks โดยใช้เวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS
โครงการ:
ชื่อ
cr_restart - รีสตาร์ทกระบวนการ กลุ่มกระบวนการ หรือเซสชันจากไฟล์จุดตรวจสอบ
เรื่องย่อ
cr_restart [ตัวเลือก] [ด่าน_file]
DESCRIPTION
cr_restart เริ่มกระบวนการใหม่ (หรือชุดของกระบวนการ) จากไฟล์จุดตรวจสอบที่สร้างด้วย
cr_จุดตรวจ(1)
กระบวนการที่เริ่มต้นใหม่มีคุณสมบัติทั้งหมดที่พวกเขามี ณ เวลาด่าน รวมถึง
รหัสกระบวนการ หากไม่สามารถบรรลุทรัพยากรที่จำเป็นใด ๆ สำหรับกระบวนการในจุดตรวจ
ไฟล์ (เช่น pid ถูกใช้งานอยู่) cr_restart จะล้มเหลว หากกลุ่มกระบวนการหรือเซสชันคือ
เริ่มต้นใหม่ ความสัมพันธ์หลัก/รองและไพพ์ทั้งหมด ฯลฯ ระหว่างกระบวนการใน
ด่านจะได้รับการบูรณะอย่างถูกต้อง
ถ้า สเตดิน/แย่/สตเดอร์ ของกระบวนการเริ่มต้นใหม่ใด ๆ ถูกนำไปยังเทอร์มินัลที่
เวลาเช็คพอยท์ จะถูกเปลี่ยนเส้นทางไปยังเทอร์มินัลควบคุมของโปรแกรม cr_restart
ไดเร็กทอรีการทำงานปัจจุบันของกระบวนการที่รีสตาร์ทจะเหมือนกับเมื่อเป็น
จุดตรวจ ไม่ว่าไฟล์บริบทจะอยู่ที่ใด หรือที่ที่ cr_restart คือ
เรียก
กระบวนการ cr_restart จะกลายเป็นพาเรนต์ของกระบวนการ 'ที่เก่าที่สุด' ในงานที่รีสตาร์ท
ซึ่งหมายความว่า เก็ทพีด(2) อาจคืนค่าอื่นให้กับกระบวนการที่เก่าที่สุดหลังจาก
เริ่มต้นใหม่. เมื่อกระบวนการรีสตาร์ทที่เก่าที่สุดออก (หรือตายจากสัญญาณ) cr_restart will
ออกด้วยรหัสข้อผิดพลาดเดียวกัน (หรือฆ่าตัวตายด้วยสัญญาณเดียวกัน) ดังนั้นจึงเป็นส่วนใหญ่
ล่องหน (จำเป็นต้องให้ cr_restart `อยู่ระหว่าง' เชลล์ของคุณและเริ่มต้นใหม่
กระบวนการ อย่างไรก็ตาม เนื่องจากเชลล์ Unix ส่วนใหญ่จะค่อนข้างสับสนหากสังเกตลูกๆ ของมัน
เปลี่ยนรหัสกระบวนการ)
สัญญาณ
โดยค่าเริ่มต้น กระบวนการเริ่มต้นใหม่จะเริ่มทำงานหลังจากการรีสตาร์ทเสร็จสิ้น อีกทางหนึ่ง
คุณอาจระบุว่าจะหยุด (via --หยุด) หรือยุติ/ยกเลิก/ถูกฆ่า (ผ่าน
--ภาคเรียน, --ยกเลิก,หรือ --ฆ่า). ทำได้โดยการส่งสัญญาณที่เหมาะสมไปยังทุก ๆ
กระบวนการที่เป็นส่วนหนึ่งของการรีสตาร์ท หากกระบวนการถูกหยุดในเวลาที่
ได้ขอจุดตรวจแล้ว --ต่อ อาจใช้เพื่อส่ง SIGCONT ไปยังกระบวนการทั้งหมดหลังจาก
การรีสตาร์ทเสร็จสมบูรณ์
ความผิดพลาด การจัดการ
โดยค่าเริ่มต้น cr_restart จะบล็อกจนกว่ากระบวนการเริ่มต้นใหม่จะเสร็จสิ้นและจะออก
ด้วยค่าทางออกเดียวกันกับกระบวนการที่เริ่มต้นใหม่ (แม้ว่ากระบวนการที่เริ่มต้นใหม่จะเสียชีวิตด้วย
สัญญาณอันตราย) สิ่งนี้ทำให้แทบจะเป็นไปไม่ได้เลยที่จะตัดสินว่าการออกจาก .ที่ไม่ใช่ศูนย์
cr_restart เกิดจากการรีสตาร์ทไม่สำเร็จ หรือเป็นรหัสทางออกของการรีสตาร์ทอย่างถูกต้อง
กระบวนการ. วิธีง่ายๆ ในการมองหา 'การรีสตาร์ทล้มเหลว:' ไม่น่าเชื่อถือ
ดังนั้นจึง --วิ่งต่อ-* แฟล็กแฟล็กมีไว้เพื่อจัดหาทางเลือกอื่น (หรือ
เพิ่มเติม) การจัดการข้อผิดพลาด เมื่อใดๆของ --วิ่งต่อ-* ธงถูกส่งผ่านเบ็ดคือ
ติดตั้งสำหรับประเภทของความล้มเหลวที่กำหนด (หรือความสำเร็จ) ตามที่กำหนดไว้ด้านล่าง เมื่อผิดพลาด
(หรือสำเร็จ) ตรวจพบและติดตั้ง hook ที่เกี่ยวข้องแล้ว hook จะถูกเรียกใช้ผ่าน the
ระบบ(3) ฟังก์ชัน หากรหัสทางออกของ hook ไม่ใช่ศูนย์ cr_restart จะส่งกลับ
ค่านี้ ระงับข้อความแสดงข้อผิดพลาดที่อาจสร้างขึ้น ถ้าไม่มีตะขอ
ติดตั้งแล้ว hook เป็นสตริงว่างหรือหาก hook ส่งคืนรหัสทางออกเป็นศูนย์
จากนั้นจะมีการพิมพ์ข้อความแสดงข้อผิดพลาดที่อธิบายและรหัสทางออกที่เกี่ยวข้องกับค่า errno
ในเวลาที่ล้มเหลวจะถูกส่งกลับ
--run-on-success='cmd'
รันคำสั่งที่กำหนดทันทีที่ทราบว่ากระบวนการเริ่มต้นใหม่เป็น
วิ่ง. หากค่าส่งคืนของ 'cmd' ไม่ใช่ศูนย์ จะส่งผลให้ cr_restart
การสิ้นสุดโดยไม่ต้องรอการสิ้นสุดของกระบวนการที่เริ่มต้นใหม่
--run-on-fail-args='cmd'
รันคำสั่งที่กำหนดหากอาร์กิวเมนต์ไม่ถูกต้อง ซึ่งรวมถึงกรณีใน
ซึ่งไฟล์บริบทที่กำหนดหายไปหรืออ่านไม่ได้
--run-on-fail-temp='cmd'
รันคำสั่งที่กำหนดหากตรวจพบความล้มเหลว "ชั่วคราว" ซึ่งรวมถึง
กรณีที่ต้องใช้ pid ที่จำเป็น
--run-on-fail-perm='cmd'
รันคำสั่งที่กำหนดหากตรวจพบความล้มเหลว "ถาวร" เป็นเรื่องปกติมากที่สุด
เนื่องจากไฟล์บริบทเสียหาย
--run-on-fail-env='cmd'
รันคำสั่งที่กำหนดหากตรวจพบความล้มเหลว "สิ่งแวดล้อม" ซึ่งรวมถึง
เมื่อไฟล์ที่จำเป็นสำหรับการรีสตาร์ทหายไปหรือไม่สามารถเข้าถึงได้
--run-on-failure='cmd'
สิ่งนี้จะติดตั้งคำสั่งที่กำหนดสำหรับ .ทั้งหมด --รันบนล้มเหลว-* ตะขอ
เนื้อไม่มีมัน การย้ายถิ่นฐาน
โดยค่าเริ่มต้น ไฟล์และไดเร็กทอรีจะถูกบันทึก `โดยการอ้างอิง' โดยจัดเก็บชื่อพาธแบบเต็มใน
ไฟล์บริบท ซึ่งรวมถึงไฟล์ที่เกี่ยวข้องกับกระบวนการผ่าน เปิด(2) และ/หรือ
มม(2) และไดเร็กทอรีที่เกี่ยวข้องผ่านทาง โอเพ่นไดร์(3) หรือเป็นไดเร็กทอรีการทำงานปัจจุบัน
การใช้งานของ --ย้าย เส้นทางเก่า = เส้นทางใหม่ อนุญาตให้ทำการแมปเส้นทางดังกล่าวไปยังตำแหน่งใหม่ได้ที่
เวลาเริ่มต้นใหม่
เมื่อแยกวิเคราะห์ --ย้าย อาร์กิวเมนต์ ลำดับ `\=' และ `\\' ถูกตีความว่าเป็น `='
และ `\' ตามลำดับ เพื่ออนุญาตเส้นทางที่มีอักขระ `=' `\'
ตัวละครไม่ได้พิเศษในบริบทอื่นใด (โปรดทราบว่า command shells ยังมี
การดูแลพิเศษของ `\' และคุณอาจต้องใช้เครื่องหมายคำพูดหรืออักขระ `\' เพิ่มเติมเพื่อ
ผ่านการโต้แย้งที่คุณตั้งใจไว้)
เมื่อกู้คืนการเชื่อมโยงไฟล์หรือไดเร็กทอรี คนแก่ เปรียบได้กับความรอด
fullpath ของแต่ละไฟล์หรือไดเร็กทอรี ถ้ามันตรงกับองค์ประกอบนำของเส้นทาง
ส่วนที่ตรงกันจะถูกแทนที่ด้วยค่าของ เส้นทางใหม่. สังเกตได้ว่า คนแก่ ต้องตรงกัน ทั้ง
ส่วนประกอบของเส้นทางและเท่านั้น ชั้นนำ ส่วนประกอบ ดังนั้น an คนแก่ of /tmp/ฟู จะตรงกัน
/tmp/ฟู or /tmp/foo/1แต่จะ ไม่ ตรงกับ /tmp/fooz (ไม่ตรงกับองค์ประกอบทั้งหมด
ฟู่) หรือ /var/tmp/foo (ไม่ตรงกับส่วนประกอบนำหน้า / var.)
สิ่งสำคัญคือต้องระวัง fullpaths ที่บันทึกไว้ในไฟล์บริบทคือ canonical
เส้นทาง ดังนั้น คนแก่ ที่คุณระบุจะต้องเป็นเส้นทางที่เป็นที่ยอมรับ แม้ว่า
เส้นทางใหม่ ไม่จำเป็นต้องเป็น ตัวอย่างเช่น if / Tmp เป็นสัญลักษณ์เชื่อมโยงไปยัง / var / tmpแล้วถ้า
แอปพลิเคชันของคุณเปิดไฟล์ /tmp/ทำงาน/1234 เส้นทางที่เก็บไว้ในไฟล์บริบทจะเป็น
/var/tmp/ทำงาน/1234. ดังนั้น
--ย้าย /tmp/ทำงาน=/tmp/เล่น
จะ ไม่ ทำงานได้ตามต้องการ แต่อย่างใดอย่างหนึ่งต่อไปนี้จะ:
--ย้าย /var/tmp/ทำงาน=/tmp/เล่น
--ย้าย /var/tmp/ทำงาน=/var/tmp/เล่น
ถ้า --ย้าย ตัวเลือกถูกส่งหลายครั้ง ทั้งหมดจะถูกนำไปใช้กับไฟล์ที่กู้คืนหรือ
การเชื่อมโยงไดเร็กทอรี แต่เฉพาะการจับคู่แรกเท่านั้นที่จะนำไปใช้กับพาธที่กำหนด ปัจจุบัน
รองรับการย้ายที่ตั้งได้สูงสุด 16 แห่ง
PID และ ที่เกี่ยวข้อง ตัวบ่งชี้
โดยค่าเริ่มต้น กระบวนการจะเริ่มต้นใหม่ด้วย pid และ thread id เดียวกัน (ตามที่ส่งคืนโดย
รับปิด(2) และ บ้าไปแล้ว(2) ตามลำดับ). ค่าเริ่มต้นนี้ทำให้มั่นใจได้ว่ากระบวนการและเธรด
ที่ส่งสัญญาณถึงกันและกระบวนการที่รอเด็ก ๆ จะยังคงทำงานต่อไป
อย่างถูกต้อง อย่างไรก็ตาม สิ่งนี้จะป้องกันการรีสตาร์ทอินสแตนซ์พร้อมกันของบริบทเดียวกัน
ไฟล์
โดยค่าเริ่มต้น กลุ่มกระบวนการและเซสชัน (ตามที่ส่งคืนโดย getpgrp(2) และ getid(2)) เป็น
ตั้งค่าเป็นโปรแกรม cr_restart สิ่งนี้ทำให้มั่นใจได้ว่าการควบคุมงานผ่านคำขอของผู้ขอ
หัวหน้าเซสชัน (โดยทั่วไปคือเชลล์การเข้าสู่ระบบ) จะยังคงทำงานได้อย่างถูกต้อง อย่างไรก็ตาม,
สิ่งนี้รบกวนการควบคุมงานหรือการส่งสัญญาณกลุ่มกระบวนการที่อาจเกิดขึ้น
ระหว่างกระบวนการเริ่มต้นใหม่
มีตัวเลือกในการควบคุมว่า pid กลุ่มกระบวนการและเซสชันเป็น
คืนค่าเป็นค่าที่บันทึกไว้หรือถือว่าค่าใหม่ (กลุ่มกระบวนการและเซสชัน
สืบทอดมาจาก cr_restart และ pid ใหม่ที่ได้รับจาก ส้อม(2)). ไม่มีแยก
ควบคุมสำหรับรหัสเธรด เนื่องจากต้องปฏิบัติตามนโยบายเดียวกันกับ pid เสมอ NS
ต่อไปนี้จะอธิบายแต่ละตัวเลือกพร้อมกับสรุปความเสี่ยงที่เกี่ยวข้องกับ
ที่ไม่ใช่ค่าเริ่มต้น:
--เรียกคืน-pid
(ค่าเริ่มต้น) สิ่งนี้ทำให้ pid และ thread id ถูกเรียกคืนเป็นค่าที่บันทึกไว้
--no-restore-pid
สิ่งนี้ทำให้ pid และ thread id ถือว่าค่าใหม่ กระบวนการแบบมัลติเธรดใดๆ
มีความเป็นไปได้ของการใช้ฟังก์ชั่นเช่น ทักษะ(2) ซึ่งจะไม่ประพฤติตนเป็น
ต้องการหากไม่ได้กู้คืนรหัสเธรด ในทำนองเดียวกัน หลายกระบวนการใดๆ
แอปพลิเคชันอาจใช้ประโยชน์จาก ฆ่า(2) หรือ รอสักครู่(2) ที่กำหนดให้
คืนค่า pids เพื่อการทำงานที่ถูกต้อง เป็นที่น่าสังเกตว่า . หลายเวอร์ชั่น
glibc จะแคชผลลัพธ์ของ getpid() ซึ่งอาจส่งผลให้มีการโทรหลังจากการคืนค่า
คืนค่าเดิมแม้ว่า pid จะถูกเปลี่ยนโดยการรีสตาร์ท
--เรียกคืน-pgid
สิ่งนี้ทำให้รหัสกลุ่มกระบวนการถูกกู้คืนเป็นค่าที่บันทึกไว้ นี่คือ
ที่จำเป็นสำหรับการทำงานที่ถูกต้องของแอพพลิเคชั่นหลายกระบวนการที่อาจทำงาน
ส่งสัญญาณหรือรอดำเนินการในกลุ่มกระบวนการ (โดยส่งค่า pid ติดลบไปที่
ฆ่า(2) หรือ รอสักครู่(2) เป็นต้น) หรือที่ใช้กลุ่มกระบวนการสำหรับงาน POSIX
ควบคุมการดำเนินงาน นี่ไม่ใช่พฤติกรรมเริ่มต้นเนื่องจากการกู้คืนกระบวนการ
รหัสกลุ่มจะป้องกันการควบคุมงานโดยเชลล์ของผู้ร้องขอ (หรือการควบคุมอื่น ๆ
กระบวนการ).
--no-restore-pgid
(ค่าเริ่มต้น) ซึ่งทำให้กระบวนการเริ่มต้นใหม่เข้าร่วมกลุ่มกระบวนการของ
cr_เริ่มต้นกระบวนการใหม่
--restore-ด้าน
สิ่งนี้ทำให้รหัสเซสชันถูกกู้คืนเป็นค่าที่บันทึกไว้ นี่คือ
จำเป็น เช่น สำหรับระบบที่ดำเนินการบัญชีแบบกลุ่มตาม
รหัสเซสชัน
--no-restore-sid
(ค่าเริ่มต้น) ซึ่งทำให้กระบวนการเริ่มต้นใหม่เข้าร่วมเซสชันของ cr_restart
กระบวนการ
โปรดทราบว่าการใช้ --เรียกคืน-pgid or --restore-ด้าน จะทำให้เกิดข้อผิดพลาดในกรณีที่
ตัวระบุที่จำเป็นถูกใช้ในระบบ ซึ่งรวมถึงความเป็นไปได้ที่
พวกเขาขัดแย้งกับกลุ่มกระบวนการหรือเซสชันของ cr_restart
OPTIONS
ทั่วไป ตัวเลือก:
- --ช่วยด้วย
พิมพ์ข้อความช่วยเหลือนี้
-v, --รุ่น
พิมพ์ข้อมูลรุ่น
-q, --เงียบ
ระงับข้อความแสดงข้อผิดพลาด/คำเตือนไปยัง stderr
Options for แหล่ง ที่ตั้ง of ด่าน:
-d, --ผบ DIR
จุดตรวจอ่านจากไดเร็กทอรี DIR โดยมีไฟล์ 'context.ID' หนึ่งไฟล์ต่อกระบวนการ
(ไม่ได้ดำเนินการ).
-f, --ไฟล์ ไฟล์
จุดตรวจอ่านจาก FILE
-F, --fd FD
จุดตรวจอ่านจากตัวอธิบายไฟล์ที่เปิดอยู่
ตัวเลือกในกลุ่มนี้ไม่มีร่วมกัน หากไม่มีตัวเลือกจากสิ่งนี้
กลุ่ม ค่าเริ่มต้นคือ รับอาร์กิวเมนต์สุดท้ายเป็น FILE
Options for สัญญาณ ส่ง ไปยัง กระบวนการ หลังจาก เริ่มต้นใหม่:
--วิ่ง ไม่มีการส่งสัญญาณ: ดำเนินการต่อไป (ค่าเริ่มต้น)
-S, --สัญญาณ NUM
สัญญาณ NUM ส่งไปยังกระบวนการ/เธรดทั้งหมด
--หยุด SIGSTOP ส่งไปยังกระบวนการทั้งหมด
--ภาคเรียน SIGTERM ส่งไปยังกระบวนการทั้งหมด
--ยกเลิก
SIGABRT ส่งไปยังกระบวนการทั้งหมด
--ฆ่า SIGKILL ส่งไปยังกระบวนการทั้งหมด
--ต่อ SIGCONT ส่งไปยังกระบวนการทั้งหมด
ตัวเลือกในกลุ่มนี้ไม่มีร่วมกัน ถ้าให้มากกว่านั้นก็เท่านั้น
คนสุดท้ายจะได้รับเกียรติ
Options for จุดตรวจ of เริ่มต้นใหม่ กระบวนการ:
--ละเว้น-บางที
ใช้ฮิวริสติกเพื่อละเว้น cr_restart จากจุดตรวจ (ค่าเริ่มต้น)
--ละเว้น-เสมอ
ละเว้น cr_restart จากจุดตรวจเสมอ
--ละ-ไม่เคย
ไม่เคยละเว้น cr_restart จากจุดตรวจ
Options for สลับกัน ความผิดพลาด การจัดการ:
--run-on-success='cmd'
รันคำสั่งที่กำหนดเมื่อสำเร็จ
--run-on-fail-args='cmd'
เรียกใช้คำสั่งที่กำหนดอาร์กิวเมนต์ไม่ถูกต้อง
--run-on-fail-temp='cmd'
เรียกใช้คำสั่งที่กำหนดในความล้มเหลว 'ชั่วคราว'
--run-on-fail-env='cmd'
เรียกใช้คำสั่งที่กำหนดเกี่ยวกับความล้มเหลว 'สิ่งแวดล้อม'
--run-on-fail-perm='cmd'
เรียกใช้คำสั่งที่กำหนดในความล้มเหลว 'ถาวร'
--รันบนความล้มเหลว='cmd'
เรียกใช้คำสั่งที่กำหนดเมื่อล้มเหลวใด ๆ
Options for การย้ายถิ่นฐาน:
--ย้าย OLDPATH=นิวพาธ
แมปพาธของไฟล์และไดเร็กทอรีไปยังตำแหน่งใหม่โดยการแทนที่คำนำหน้า
ตัวเลือกสำหรับการกู้คืน pid กลุ่มกระบวนการและรหัสเซสชัน
--เรียกคืน-pid
กู้คืน pids เป็นค่าที่บันทึกไว้ (ค่าเริ่มต้น)
--no-restore-pid
เริ่มต้นใหม่ด้วย pids ใหม่
--เรียกคืน-pgid
กู้คืน pgid เป็นค่าที่บันทึกไว้
--no-restore-pgid
รีสตาร์ทด้วย pgids ใหม่ (ค่าเริ่มต้น)
--restore-ด้าน
คืนค่า sid เป็นค่าที่บันทึกไว้
--no-restore-sid
รีสตาร์ทด้วย sids ใหม่ (ค่าเริ่มต้น)
ตัวเลือกในแต่ละคู่การคืนค่า/ไม่มีการคืนค่าจะไม่เกิดร่วมกัน ถ้าให้ทั้งสองอย่าง
แล้วคนสุดท้ายเท่านั้นที่จะได้รับเกียรติ
Options for เมล็ด เข้าสู่ระบบ ข้อความ (ค่าเริ่มต้น is --kmsg-ข้อผิดพลาด):
--kmsg-ไม่มี
ไม่รายงานข้อความเคอร์เนลใด ๆ
--kmsg-ข้อผิดพลาด
เมื่อการรีสตาร์ทล้มเหลว รายงานบน stderr ข้อความเคอร์เนลที่เกี่ยวข้องกับ
รีสตาร์ทคำขอ
--kmsg-คำเตือน
รายงานเกี่ยวกับ stderr ข้อความเคอร์เนลที่เกี่ยวข้องกับคำขอรีสตาร์ท
โดยไม่คำนึงถึงความสำเร็จหรือความล้มเหลว ข้อความที่สร้างขึ้นโดยไม่มีข้อผิดพลาดคือ
ถือเป็นการตักเตือน
ตัวเลือกในกลุ่มนี้ไม่มีร่วมกัน ถ้าให้มากกว่านั้นก็เท่านั้น
คนสุดท้ายจะได้รับเกียรติ สังเกตว่า --เงียบ ระงับเอาต์พุต stderr ทั้งหมด
รวมทั้งข้อความเหล่านี้
ผู้เขียน
Jason Duell, Paul Hargrove และ Eric Roman, ห้องทดลองแห่งชาติ Lawrence Berkeley
รายงาน ข้อบกพร่อง
รายงานข้อผิดพลาดสามารถยื่นบนเว็บได้ที่ http://mantis.lbl.gov/bugzilla.
ใช้ cr_restart ออนไลน์โดยใช้บริการ onworks.net