เกิดอะไรขึ้นกับผลลัพธ์ของกระบวนการที่ถูกปฏิเสธและสูญเสียเทอร์มินัล


26

ถ้าฉันปิดเทอร์มินัลเสมือนซึ่งบางกระบวนการเริ่มทำงานเอาต์พุตจะตรงไป/dev/nullหรืออาจทำให้หน่วยความจำสกปรกได้หรือไม่ ฉันสามารถดึงเอาท์พุทออกมาอ่านต่อได้หลังจากนั้นได้ไหม?

[แก้ไข]: ดังนั้นเป็นช่วงเวลาของการปฏิเสธกระบวนการอย่างมีประสิทธิภาพสิ้นอำนาจของฉันในการควบคุมการส่งออกของมันได้หรือไม่

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


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

ขอบคุณสำหรับลิงก์ไปยังคำถามนั้น มันให้คำตอบที่ดีที่สุดกับฉัน! โดยเฉพาะrettyโปรแกรมที่ฉลาด
rozcietrzewiacz

1
ดูคำตอบนี้กับคำถามที่เกี่ยวข้อง
Stéphane Gimenez

คำตอบ:


11

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

เกี่ยวกับสิ่งที่เกิดขึ้นกับผลลัพธ์ที่ส่งไปยังเทอร์มินัลเสมือนที่ถูกลบ: ฉันทำการทดสอบด้วยตัวเองและฉันสังเกตเห็นว่า/dev/pts/xอุปกรณ์ไม่สามารถเข้าถึงได้และจะไม่ถูกจัดสรรอีกจนกว่าจะมีการปิดตัวบันทึกทั้งหมด ดังนั้นฉันไม่เห็นเหตุผลที่เขียนไปยังเทอร์มินัลที่ถูกลบจะถูกเก็บไว้ ฉันเดาว่านี่ไม่ได้กำหนดโดย POSIX

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

เกี่ยวกับคำพูดสุดท้ายเกี่ยวกับการยุติกระบวนการฉันไม่รู้จริง ๆ ว่าเกิดอะไรขึ้น แต่ฉันสงสัยว่าพฤติกรรมที่ค่อนข้างแปลกประหลาดกับสัญญาณ (SIGTTOU, SIGTTIN, SIGHUP หรืออื่น ๆ ) ที่เกี่ยวข้องกับสถานะเบื้องหน้า / พื้นหลังของกลุ่มกระบวนการเมื่อเซสชัน ออกจากผู้นำ (เช่นsuในกรณีที่คุณพูดถึง)

คำตอบสำหรับการแก้ไข:ไม่เกี่ยวกับผลลัพธ์ไม่มีการเปลี่ยนแปลงเมื่อกระบวนการถูกปฏิเสธ: ยังคงแนบกับเทอร์มินัลการควบคุมของมัน psคุณจะเห็นว่าการใช้ อย่างไรก็ตามคุณจะไม่สามารถใช้fg/ bg/ jobsคำสั่งจากเชลล์อีกต่อไปสำหรับกระบวนการนี้ ซึ่งหมายความว่าอาจเป็นเรื่องยากที่จะป้อนด้วยอินพุตจากเทอร์มินัล (ต้องอยู่ในกลุ่มกระบวนการพื้นหน้า)

-
1. ยกเว้นว่ากระบวนการยินดีหรือถูกจี้ด้วยเครื่องมือแก้ไขข้อบกพร่องบางอย่าง (ดูความคิดเห็นด้านบน)


1
ขอบคุณสำหรับการชี้แจงนี้เล็กน้อย ที่จริงแล้วความจริงของการปฏิเสธกระบวนการยังคงเกี่ยวข้องกับคำถามของฉัน: หลังจากการปฏิเสธกระบวนการฉันดูเหมือนจะสูญเสียความสามารถในการควบคุมผลลัพธ์ของมันใช่ไหม? (แม้ว่าเทอร์มินัลปิดแล้ว) ฉันจะแก้ไขคำถามเพื่อรวมกรณีดังกล่าว
rozcietrzewiacz

4

เพียงเพื่อตอบคำถามนี้โดยเฉพาะ:

ถ้าฉันปิดเทอร์มินัลเสมือนซึ่งบางกระบวนการเริ่มทำงานเอาต์พุตจะส่งตรงไปยัง / dev / null หรืออาจทำให้หน่วยความจำสกปรกหรือไม่

เทอร์มินัลและโปรแกรมที่เชื่อมต่อกับสื่อสารผ่านอุปกรณ์ tty โดยการอ่านและเขียนเหมือนไฟล์ โดยเฉพาะเทอร์มินัลเสมือนสร้าง "pseudo-tty" ("pty" โดยย่อ) จากนั้นวางกระบวนการเชลล์ (หรืออื่น ๆ ) และเชื่อมต่อ stdin / out / err ของกระบวนการนั้นกับ pty (รายละเอียดแตกต่างกันไปตามระบบปฏิบัติการ)

เมื่อคุณปิดเทอร์มินัลเสมือนเทอร์มินัลเสมือนจะปิดการเชื่อมต่อปลาย (pty "master") หลังจากนั้นหากโปรแกรมที่ปลายอีกด้านของการเชื่อมต่อเขียนไปยัง tty ข้อผิดพลาดจะถูกส่งกลับและข้อมูลจะไม่ไปไหน ในทำนองเดียวกันถ้ามันอ่านจาก tty มันจะกลับมาเป็นตัวบ่งชี้ EOF (สิ้นสุดไฟล์)


ขอบคุณ - คำอธิบายที่ดีและชัดเจนจากมุมมองการเขียนโปรแกรมอีกเล็กน้อย
rozcietrzewiacz

3

ในการตอบคำถามที่น่าสนใจที่สุดของคุณ: เพื่อเปลี่ยนผลลัพธ์ของโปรแกรมที่ทำงานอยู่คุณต้องแก้ไขไฟล์อธิบาย นั่นเป็นเรื่องง่ายที่จะทำกับ gdb มันแฮ็ค แต่ใช้ได้

ดู:

https://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

สคริปต์ช่วยที่สามารถใช้ได้ที่http://users.linpro.no/ingvar/fdswap.sh.txt


0

ขอขอบคุณที่แสดงความคิดเห็นโดยกิลส์ชี้ให้ฉันไปคำถามนี้ผมได้เรียนรู้เกี่ยวกับโปรแกรมที่เรียกว่าRetty

ดูเหมือนว่าจะใช้แฮ็คที่สกปรกเพื่อติดตั้งใหม่ (หลอก) อย่างมีประสิทธิภาพช่วยให้สามารถอ่านผลลัพธ์ของกระบวนการต่อได้ไม่ว่าจะถูกปฏิเสธหรือไม่ก็ตาม ดังนั้นนี่ดูเหมือนจะตอบคำถามแรกของฉันส่วนใหญ่ ที่สองได้รับการตอบโดยStéphane

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