เหตุใด ssh จึงรอให้กระบวนการที่เรียกทำงานทั้งหมดออกจากระบบ


1

ฉันกำลังเรียกใช้สคริปต์จากเครื่องหนึ่งในอีกเครื่องหนึ่งโดยใช้ ssh

ssh <host> a.pl

ตอนนี้ a.pl เริ่มต้นอินสแตนซ์อื่น ๆ ของ a.pl โดยใช้วิธี 'system' และดำเนินการแต่ละอันในพื้นหลัง ฉันได้รวมกับ LDAP และเมื่อหนึ่งในอินสแตนซ์ตายสคริปต์ a.pl หลักมารู้เกี่ยวกับเรื่องนี้อย่างต่อเนื่องในการตรวจสอบพวกเขา ดังนั้นเมื่อพบว่าหนึ่งในอินสแตนซ์นั้นเสียชีวิตสคริปต์หลักก็จะตายเช่นกันและอินสแตนซ์ที่เหลือก็จะเป็นของ init (1)

ฉันคาดว่า ssh จะออกเมื่อสคริปต์หลักนี้ตาย แต่อย่างใดดูเหมือนว่า ssh ยังคงรอกระบวนการทั้งหมดที่เปิดตัว ออกจาก ssh เมื่อฉันฆ่าอินสแตนซ์ที่เหลือ

นี่เป็นพฤติกรรมที่คาดหวังหรือไม่? ถ้าใช่ทำไมถึงเป็นเช่นนั้น

คำตอบ:


1

ใช่. นี่เป็นพฤติกรรมที่คาดหวัง คุณไม่ต้องการให้มีกระบวนการจากผู้ใช้ที่ล็อกเอาต์จากระบบของคุณ สำหรับกรณีการใช้งานนี้มีบริการ

ภายในนั้นมีสาเหตุมาจากข้อเท็จจริงที่ว่า ssh กำลังรอเวลาที่กระบวนการที่เรียกใช้งานจะปิดการจัดการไฟล์ (stdin, stdout, stderr) ซึ่งจะถูกเปลี่ยนเส้นทางไปยังลูกค้า โดยการเรียกใช้สคริปต์อื่นพวกเขาจะสืบทอดการจัดการไฟล์เดียวกันและดังนั้นจึงไม่ได้ปิดอย่างสมบูรณ์ก่อนที่เด็กทุกคนจะปิดพวกเขาอย่างสมบูรณ์


ฉันคิดออกและนี่เป็นเพราะการเปิดไฟล์ที่เป็นเจ้าของโดยกระบวนการ sshd อินสแตนซ์ที่มีการแยกกำลังเขียน stdout ไปยังไพพ์ FIFO ซึ่งเป็นเจ้าของโดย sshd และดังนั้น ssh จึงไม่ออก การเปลี่ยนเส้นทาง stdout ไปยังไฟล์หรือ / dev / null แก้ปัญหาให้ฉันได้ ขอบคุณสำหรับความช่วยเหลือของคุณ @Jakuje
bpositive
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.