ฉันจะเชื่อมต่อกับหน้าจอที่หายไปได้อย่างไร


23

ฉันมีscreenเซสชันที่ทำงานบนเซิร์ฟเวอร์ที่บ้าน เวิร์กสเตชันของฉันต้องการการรีบู๊ตดังนั้นฉันจึงถอดและฆ่ามินัล เมื่อเชื่อมต่อกับเซิร์ฟเวอร์อีกครั้งฉันจะใช้งานตามปกติ

$ screen -D -R
[new screen]

ฮะ? ไม่ไม่ใช่เซสชั่นใหม่ลองชิมอันเก่า ฉันรู้ว่าฉันจะคว้ามันโดยตรง ชื่อซ็อกเก็ตคืออะไร?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

รออะไร? ฉันรู้ว่าฉันปล่อยให้มันทำงาน มันจะไปไหน

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

มีกระบวนการ screen -rแต่มีซ็อกเก็ตที่จะส่งผ่านไปยังไม่มี ฉันจะแนบเซสชันของฉันใหม่ได้อย่างไร?

คำตอบ:


28

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 ไม่ปรากฏขึ้นอีกให้ทำลายกระบวนการเชลล์ คุณเสียสละเปลือกหนึ่งเพื่อบันทึกส่วนที่เหลือ หากไม่มีสิ่งใดทำงานได้โปรดอย่าลืมลบกระบวนการทั้งหมดที่ทำงานอยู่ในหน้าจอที่หายไป

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