ดูการเปลี่ยนเส้นทาง STDOUT ของกระบวนการทำงาน


17

ถ้าฉันเริ่มต้นแอพด้วยคำสั่งนี้:

/path/to/my/command >> /var/log/command.log

และคำสั่งจะไม่ส่งคืนมีวิธีอื่นจากพรอมต์อื่นหรือไม่เพื่อดูว่าการเปลี่ยนเส้นทาง STDOUT ถูกตั้งค่าเป็นอะไร

ฉันกำลังมองหาบางอย่างเช่น

cat /proc/PID/redirects

หรือ

ps -??? | grep PID

แต่วิธีการใด ๆ ที่จะทำ

คำตอบ:


22

ตรวจสอบไฟล์อธิบาย # 1 (STDOUT) /proc/$PID/fd/ใน เคอร์เนลแสดงถึงไฟล์นี้เป็นลิงก์สัญลักษณ์ไปยังไฟล์ที่ descriptor ถูกเปลี่ยนเส้นทางไป

$ readlink -f /proc/20361/fd/1
/tmp/file

ที่สมบูรณ์แบบ! ขอบคุณ! คุณสามารถให้ลิงค์หรือรายละเอียดเกี่ยวกับการเปลี่ยนเส้นทางอื่น ๆ เช่น STDERR นั่นคือหมายเลขใด
Rich

อย่างน้อยบน Linux (และฉันเชื่อว่าทุกคนรู้จัก UNIX-like OS) พวกเขาคือ 0: stdin, 1: stdout, 2: stderr (ข้อผิดพลาดมาตรฐาน) โปรดทราบว่ามีมาโคร C ที่กำหนดไว้ใน <stdio.h>: STD {IN, OUT, ERR} _FILENO ดู 'man stdout' สำหรับรายละเอียด
Petr Uzel

0, 1, 2 สำหรับ stdin, stdout และ stderr ตามลำดับมีการรับประกันในระบบ Unix / Unix-like ทั้งหมดและเป็นจริงบน Windows
Paul Stelian

บน MacOS วิธีใด ๆ ในการทำเช่นนี้? / proc / <pid> / fd / 1 ไม่มีอยู่ฉันสามารถใช้ mkfifo ได้ไหม?
Alexander Mills

4

เครื่องมือที่มีประโยชน์เพื่อดูว่าไฟล์ใดถูกเปิดโดยกระบวนการlsofใด คุณสามารถชี้ไปที่กระบวนการเฉพาะด้วยlsof -p1234และคุณจะเห็นข้อมูลส่วนใหญ่เหมือนกับที่คุณได้รับจากls -l /proc/1234/fdLinux เช่นไฟล์ที่เปิด

สิ่งที่มีประโยชน์มากที่สุดlsofคือไปในทางตรงกันข้าม: lsof /path/to/fileบอกคุณว่ากระบวนการกำลังใช้ไฟล์นั้นอยู่


1

คำตอบมากมายพูดถึงการทำแบบนี้:

tail -f /proc/{PID}/fd/1

อย่างไรก็ตามฉันพบว่ามันไม่ได้ผลเสมอไป หรือมิcatฉะนั้นบางครั้งก็ให้ผลลัพธ์

cat /proc/{PID}/fd/1

โดยที่ {PID} สามารถค้นหาโดยใช้ps auxคำสั่ง

ยังดีที่จะกล่าวถึงก็คือตัวเลขในตอนท้ายของคำสั่ง (ในกรณีนี้ fd / 1) สามารถเปลี่ยนแปลงได้สำหรับเอาท์พุทอื่น ๆ

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.