มีวิธีการ 'ติดตั้งใหม่' กระบวนการไปยังตารางงานเชลล์หลังจากที่มันถูก 'ปฏิเสธ' หรือไม่?
แก้ไข: $ SEARCHENGINE ทำให้ฉันทั้งหมดล้มเหลว ดูไม่ดีเกินไป
มีวิธีการ 'ติดตั้งใหม่' กระบวนการไปยังตารางงานเชลล์หลังจากที่มันถูก 'ปฏิเสธ' หรือไม่?
แก้ไข: $ SEARCHENGINE ทำให้ฉันทั้งหมดล้มเหลว ดูไม่ดีเกินไป
คำตอบ:
เมื่อพิจารณาว่างานลินุกซ์และความเป็นเจ้าของกระบวนการทำงานได้อย่างไรฉันกลัวว่าเป็นไปไม่ได้ที่จะเป็นเจ้าของกระบวนการอีกครั้งโดยไม่ได้รับความช่วยเหลือจากกระบวนการปรับใช้
ผู้ปกครองอาจ 'ปฏิเสธ' เด็กซึ่งก็คือ 'บุญธรรม' โดยกระบวนการที่ชื่อว่า 'init' ความปลอดภัยของระบบป้องกันไม่ให้ใครบางคนคว้ากระบวนการของคนอื่น เมื่อคุณปฏิเสธมันกระบวนการจะกลายเป็นของคนอื่น (init's) เพื่อควบคุม คุณในฐานะ 'ผู้ใช้' ยังคงสามารถฆ่ากระบวนการ แต่คุณไม่สามารถรับกลับคืนมาได้ ความพยายามในการบีบบังคับ init เพื่อส่งคืนโพรเซสของคุณไม่น่าเป็นไปได้เนื่องจาก init ไม่ได้แม้แต่อ่านเมล
ในขณะที่มันฟังดูเหมือนจะเป็นคำตอบของ "อย่าทำอย่างนั้นจริงๆ"
reptyr
(ดูคำตอบของฉันสำหรับตัวอย่างการใช้งาน)
ในขณะที่ฉันคิดว่าสิ่งนี้จะไม่ช่วยใครก็ตามในสถานการณ์ที่โชคร้ายที่ปฏิเสธกระบวนการที่ไม่ถูกต้องหากคุณถูกไล่ออกจากงานและแทนที่ด้วย:
https://github.com/nelhage/reptyr
คุณจะสามารถซ่อมแซมกระบวนการใด ๆ (เช่นย้ายภายในหน้าจอ)
reptyr
เป็นวิธีการแก้ disown
แต่มีความจำเป็นต้องหยุดการใช้ เพื่อความชัดเจนฉันได้เขียนคำตอบใหม่
reptyr
ทั้งหมดที่คุณต้องการก็คือ มันอาศัยอยู่บนGitHubและได้รับการบรรจุสำหรับ Debian ตั้งแต่ Wheezy และอาจเป็นไปได้สำหรับ GNU / Linux distros อื่น ๆ เช่นกัน มันจะทำงานเบื้องหน้ากระบวนการที่ถูกปฏิเสธของคุณในเทอร์มินัลปัจจุบันหากคุณเรียกใช้ด้วย ID กระบวนการ (PID) ตัวอย่างเช่น:
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
ขอโทษค่ะ โดยหลักการแล้วมันอาจเป็นไปได้เนื่องจากการปฏิเสธเพียงแค่เปลี่ยนสถานะภายในเชลล์บางอย่าง - โดยทั่วไปจะลบ ID กระบวนการออกจากรายการและสามารถนำกลับมาได้โดยไม่ต้องยุ่งยากมากเกินไป (คุณต้องระมัดระวังในการทดสอบเล็กน้อยว่า pid ที่ reattached อยู่ในเซสชั่นที่ถูกต้อง แต่นั่นไม่สามารถผ่านไม่ได้) แต่ไม่มีกระสุนธรรมดา (bash, ksh, tcsh, zsh) ที่ดูเหมือนจะมีวิธีการเพิ่มอีกครั้ง (แม้ว่าจะมี zsh คุณสามารถเขียนไปยังjobstates
, jobdirs
และjobtext
อาร์เรย์ที่เชื่อมโยงกันได้ แต่ฉันไม่รู้ว่าคุณจะบรรลุเป้าหมายนั้นได้มากแค่ไหน)
หากคุณต้องการให้เชลล์ส่งสัญญาณไปยังกระบวนการที่ถูกปฏิเสธเช่นเดียวกับที่ทำไว้สำหรับกระบวนการย่อยที่เป็นเจ้าของคุณสามารถเขียนงานสตับที่รอจนกว่าจะได้รับสัญญาณและส่งสัญญาณเดียวกันไปยังกระบวนการที่ถูกปฏิเสธ คุณสามารถส่งSIGSTOP
และSIGCONT
กระบวนการปฏิเสธที่จะจำลองCtrl+ และZ bg
สิ่งเหล่านี้จะไม่สะดวกพอ ๆ กับการเป็นเจ้าของอีกครั้ง
สถานการณ์อะไรบ้าง ถ้าคุณต้องการเอาเครื่องกลับมาซักระยะหนึ่งคุณสามารถใช้หน้าจอ GNUแทนได้ มันไม่ได้ค่อนข้างถอดกระบวนการจากขั้ว - หน้าจอจำลองหนึ่งเพื่อประโยชน์ของกระบวนการ - แต่คุณสามารถแนบและแยกออกจากขั้วจริงที่คุณกำลังใช้ คุณสามารถแยกหน้าจอออกจากระบบจากนั้นกลับเข้าสู่ระบบอีกครั้งและแนบกับหน้าจอเดียวกัน