Screen
ตรวจสอบ Fifo / socket ทุกครั้งที่รับSIGCHLD
สัญญาณ หากซ็อกเก็ตหายไปมันจะถูกสร้างขึ้นใหม่ SIGCHLD
ดังนั้นวิธีการแก้ปัญหาคือการหากระบวนการและส่ง
ในระบบ Debian ของฉันscreen
ดูเหมือนว่าจะติดตั้งเป็น setgid utmp
แต่ไม่ได้ setuid ดังนั้นวิธีแก้ปัญหาแรกจากคำถามที่พบบ่อยด้านล่างนี้ทำงาน:
$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost
ในระบบที่ติดตั้งหน้าจอ setuid root
สิ่งนี้จะไม่ทำงานและคุณจะต้องฆ่ากระบวนการลูกอย่างใดอย่างหนึ่งของเซสชันหน้าจอที่ใช้งานอยู่เพื่อบังคับให้เคอร์เนลส่งสัญญาณให้คุณ นี่หมายถึงการเสียสละหน้าต่างหน้าจอของคุณเพื่อเชื่อมต่อกับส่วนที่เหลือ (เลือกอย่างชาญฉลาด!)
จากGentoo Wiki คำถามที่พบบ่อยที่เก็บถาวร :
ซ็อกเก็ตหายไป
บางครั้งซ็อกเก็ตของหน้าจอที่ทำงานอยู่อาจถูกทำลายได้แม้ว่ากระบวนการจริงและกระบวนการลูกทั้งหมดจะยังคงทำงานอยู่ รายชื่อหน้าจอจะแสดง "ไม่มีช่องเสียบที่พบใน / tmp / uscreens / .." บางคำแนะนำที่มีประโยชน์สำหรับวิธีการกู้คืนนี้ (และเพียงไม่กี่ปัญหาเรื่องผิดปกติอื่น ๆ ) ที่http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC
ประมาณ 2/3
ถาม:ด้วยเหตุผลที่ไม่ทราบสาเหตุฟีเจอร์ in / tmp / screens / S-myname หายไปและฉันไม่สามารถดำเนินการเซสชันหน้าจอของฉันต่อได้ มีวิธีสร้าง Fifo หรือไม่?
ตอบ:หน้าจอจะตรวจสอบ Fifo / socket ทุกครั้งที่รับสัญญาณ SIGCHLD หากขาดหายไปจะมีการสร้าง Fifo / socket ขึ้นใหม่
หากหน้าจอไม่ทำงานการตั้งค่าผู้ใช้สามารถออก
kill -CHLD screenpid
โดยตรง (มันเป็น-CHILD
ในบางระบบ) Screenpid เป็นรหัสกระบวนการของกระบวนการหน้าจอที่พบในps -x
รายชื่อ
แต่โดยปกติจะใช้ไม่ได้ผลเนื่องจากหน้าจอควรติดตั้ง setuid root ในกรณีนี้คุณจะไม่สามารถส่งสัญญาณได้ แต่เคอร์เนลจะ มันจะทำเช่นนั้นเมื่อใดก็ตามที่ลูกของหน้าจอเปลี่ยนสถานะ ค้นหา process-id (shellpid ด้านล่าง) ของเชลล์ "สำคัญน้อยที่สุด" ที่ทำงานอยู่ภายในหน้าจอ kill -STOP shellpid
ลอง หาก Fifo / socket ไม่ปรากฏขึ้นอีกให้ทำลายกระบวนการเชลล์ คุณเสียสละเปลือกหนึ่งเพื่อบันทึกส่วนที่เหลือ หากไม่มีสิ่งใดทำงานได้โปรดอย่าลืมลบกระบวนการทั้งหมดที่ทำงานอยู่ในหน้าจอที่หายไป