จะทราบได้อย่างไรว่ากระบวนการใดที่เขียนถึง STDOUT


19

ฉันมีกระบวนการทำงานสองกรณี หนึ่งในนั้นคือ "frEAkIng oUT!" และข้อผิดพลาดการพิมพ์ไม่หยุดที่ STDOUT

ฉันต้องการฆ่ากระบวนการที่เสียหาย แต่ฉันต้องทำให้แน่ใจว่าฉันจะไม่ยุติกระบวนการที่ผิด พวกเขาทั้งคู่เริ่มต้นพร้อมกันและใช้topฉันสามารถเห็นพวกเขาทั้งคู่ใช้หน่วยความจำและ CPU ในปริมาณเท่ากัน ฉันไม่สามารถหาสิ่งใดที่ชี้ให้เห็นว่ากระบวนการใดที่ทำงานไม่ดี

สิ่งที่ปลอดภัยที่สุดคือการพิจารณาว่ากระบวนการใด / pid ที่เขียนไปยัง STDOUT

มีวิธีใดที่จะทำเช่นนั้น?


1
การเขียนไปยัง stdoutจะหมายถึงการเขียนไปยังไฟล์ descriptor 1 ((ของกระบวนการที่เป็นปัญหา) ซึ่งอาจเป็นอะไรก็ได้เช่นเทอร์มินัลหรือ/dev/null) คุณแน่ใจหรือว่าคุณไม่ได้หมายถึงไฟล์เฉพาะแทน (เช่นอุปกรณ์ปลายทางหรือไฟล์บันทึก ... )
Stéphane Chazelas

หากพวกเขาทั้งคู่เริ่มต้นในเชลล์เดียวกันพวกเขาทั้งคู่กำลังเขียนถึง STDOUT ดังนั้นการปักหมุดนี้จะไม่ช่วยให้คุณระบุว่าจะฆ่าอันไหน วิธีการของ Jofel น่าจะเป็นสิ่งที่คุณกำลังมองหา
slm

สิ่งที่เขาจริงๆหมายถึงเป็นที่หนึ่งคือการผลิตการส่งออกใน terminal
Barmar

คำตอบ:


17

บน Linux สมมติว่าคุณต้องการทราบว่ามีการเขียนอะไรไปยังทรัพยากรเดียวกันกับที่ stdout ของเชลล์เชื่อมต่ออยู่คุณสามารถทำได้:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

ที่จะรายงานการwrite()เรียกของระบบ (บนตัวอธิบายไฟล์ใด ๆ ) ของทุกกระบวนการที่มีตัวอธิบายไฟล์อย่างน้อยหนึ่งตัวเปิดอยู่บนไฟล์เดียวกันกับ fd 1 ของเชลล์ของคุณ


นั่นคือสิ่งที่ฉันนึกไว้ในตอนแรกฉันจะลองทั้งสองวิธีด้วยกันทั้งสองคน
TCZ8

23

คุณสามารถหยุดการประมวลผลทั้งสองได้โดยส่ง SIGSTOP (แทนที่ pid1 และ pid2 ด้วยPIDจริงหรือใช้killallและชื่อแอปพลิเคชัน):

kill -SIGSTOP pid1 pid2

การพิมพ์บนเครื่อง (หรือที่ใดก็ตามที่ stdout ถูกเปลี่ยนเส้นทางไป) ควรหยุด จากนั้นใช้หนึ่งในนั้นต่อไป

kill -SIGCONT pid1

หากข้อความแสดงข้อผิดพลาดปรากฏขึ้นทันทีคุณจะรู้ว่าเป็นกระบวนการแรก ถ้าไม่คุณสามารถหยุดมันอีกครั้งและดำเนินการต่อที่สอง ...

ก่อนที่จะฆ่ากระบวนการที่หยุดทำงานมันเป็นการดีที่จะส่ง SIGCONT ก่อน

เทคนิคเดียวกันนี้สามารถใช้กับCtrl-Zและควบคุมงานเปลือก ( fg %1, bg %1, kill %1, ... )


1
นั่นเป็นวิธีที่ดีมากในการแก้ไขปัญหา แต่ฉันก็กำลังมองหาวิธีการติดตามผู้ที่กำลังเทอร์มินัล ขอบคุณ
TCZ8

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