เป็นไปได้ไหมที่จะอ่านเอาต์พุตจากกระบวนการใด ๆ โดยใช้ PID ของมัน?


32

เป็นไปได้หรือไม่ที่จะแนบเทอร์มินัลเข้ากับกระบวนการที่กำลังทำงานอยู่โดยใช้ PID ในลักษณะเดียวกันกับการใช้fgคำสั่งสำหรับงาน?


เช่นอะไร?! กระบวนการที่คุณต้องการแนบคืออะไร!

ฉันต้องการดูผลลัพธ์ของโปรแกรมที่เริ่มต้นในเทอร์มินัลอื่น
Tommy

คำตอบ:


43

คุณสามารถรับไฟล์ descriptor มาตรฐานของกระบวนการเช่นstdout:

tail -f /proc/<pid>/fd/1

8
ฉันลองใช้วิธีแก้ปัญหานี้กับด้านบนและดูเหมือนจะไม่ทำงาน ในเทอร์มินัลฉันเปิดใช้งานด้านบนและอีกอันฉันใช้คำสั่งของคุณกับ pid corred แต่ไม่มีเอาต์พุต
Tommy

1
คุณจะทำสิ่งนี้บน mac ได้อย่างไร?
Avner Barr

แล้ว stderr ล่ะ ฉันถือว่า / proc / <pid> / fd / 2 แต่แล้วคุณจะได้รับทั้ง stdout / stderr ได้อย่างไร
Alexander Mills

1
เกิดอะไรขึ้นถ้าตัวบ่งชี้นี้ชี้ไปที่ซ็อกเก็ต? หางไม่สามารถอ่านได้# ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Imaskar พูดว่า Reinstate Monica

8

มีตัวเลือกน้อยที่นี่ หนึ่งคือการเปลี่ยนเส้นทางการส่งออกของคำสั่งไปยังไฟล์และจากนั้นใช้tailเพื่อดูบรรทัดใหม่ที่ถูกเพิ่มไปยังไฟล์นั้นในเวลาจริง

อีกทางเลือกหนึ่งคือการเปิดโปรแกรมของscreenคุณซึ่งเป็นแอพพลิเคชั่นเทอร์มินัลประเภทข้อความ เซสชันหน้าจอสามารถแนบและแยกออกได้ แต่มีความหมายในนามเท่านั้นที่จะใช้โดยผู้ใช้รายเดียวกันดังนั้นหากคุณต้องการแบ่งปันระหว่างผู้ใช้

ถ้าคุณต้องการคุณสามารถติดตามกระบวนการและดูว่ามันทำอะไรกับstrace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: แนบกับกระบวนการด้วย ID กระบวนการ PID และเริ่มการติดตาม
  • -s SIZE: ระบุขนาดสตริงสูงสุดที่จะพิมพ์ (ค่าเริ่มต้นคือ 32)
  • -o filename: เขียนเอาต์พุตการติดตามไปยังชื่อไฟล์ไฟล์แทนไปยังหน้าจอ (stderr)

ในที่สุดมันก็ดูเหมือนจะไม่ทำงาน ฉันเปิดตัวด้านบนและในอีกฉันใช้คำสั่งของคุณกับ pid corred แต่ไม่ได้รับผลลัพธ์ที่คาดหวัง เมื่อฉันใช้หางในภายหลัง
Tommy

คุณต้องใช้sudoกับ strace เพื่อแนบกับกระบวนการและใช้-o ~/output.txtเพื่อให้ไฟล์นั้นอยู่ในโฟลเดอร์บ้านของคุณ

ใช้ไฟล์ที่ส่งออกอย่าส่งไปที่หน้าจอ! อย่าเป็นคนงี่เง่าอย่างที่ฉันเป็นและกด Ctrl-C เพื่อออกจาก strace แล้วถอด PID ของฉันออก กลัวอึออกจากฉันในสคริปต์ที่สำคัญ
Weston Ganger

3

คุณสามารถใช้คำสั่งเหล่านี้ที่ให้ไว้ด้านล่างเพื่อแนบกระบวนการทำงานบนเทอร์มินัลอื่น:

  • retty(หน้าคน: retty )
  • reptyr
  • screen

ตัวอย่าง:

screen -S PID
retty $(pgrep PID)
reptyr PID

ฉันไม่สามารถค้นหาซ้ำได้หรือลองอีกครั้ง นอกจากนี้เพื่อให้สามารถใช้หน้าจอได้ฉันต้องเรียกใช้กระบวนการดั้งเดิมด้วยดังนั้นจึงไม่สามารถแก้ปัญหาของฉันได้
Tommy

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