Xem chuyển hướng STDOUT của một quy trình đang chạy


17

Nếu tôi khởi động một ứng dụng bằng lệnh này:

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

Và lệnh không quay trở lại, có cách nào, từ một dấu nhắc khác, để xem chuyển hướng STDOUT được đặt thành gì không?

Tôi đang tìm kiếm một cái gì đó giống như

cat /proc/PID/redirects

hoặc là

ps -??? | grep PID

nhưng phương pháp nào cũng được.

Câu trả lời:


22

Kiểm tra mô tả tập tin số 1 (STDOUT) trong /proc/$PID/fd/. Hạt nhân đại diện cho tệp này là liên kết tượng trưng đến một tệp mà bộ mô tả được chuyển hướng đến.

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

Hoàn hảo! Cảm ơn! Bạn có thể cung cấp một liên kết hoặc chi tiết về các chuyển hướng khác, chẳng hạn như STDERR, tức là chúng là những con số nào?
Giàu

Ít nhất là trên Linux (và tôi tin rằng trên mọi HĐH giống UNIX đã biết khác) chúng là 0: stdin, 1: stdout, 2: stderr (lỗi tiêu chuẩn). Lưu ý rằng cũng có các macro C được xác định trong <stdio.h>: STD {IN, OUT, ERR} _FILENO. Xem 'man stdout' để biết chi tiết.
Petr Uzel

0, 1, 2 cho stdin, stdout và stderr tương ứng được đảm bảo trong tất cả các hệ thống giống Unix / Unix và cũng đúng trên Windows.
Paul Stelian

trên MacOS có cách nào để làm điều này không? / Proc / <pid> / fd / 1 không tồn tại, có lẽ tôi có thể sử dụng mkfifo?
Alexander Mills

4

Một công cụ hữu ích để xem các tập tin được mở bởi các quá trình là gì lsof. Bạn có thể chỉ ra nó trong một quy trình cụ thể lsof -p1234và bạn sẽ thấy hầu hết các thông tin giống như bạn có thể có ls -l /proc/1234/fdtrong Linux, tức là những tệp nào được mở.

Điều hữu ích nhất lsoflà đi theo chiều ngược lại: lsof /path/to/filecho bạn biết các quy trình đang sử dụng tệp đó.


1

Rất nhiều câu trả lời đề cập đến việc làm theo cách này:

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

Tuy nhiên, tôi thấy rằng nó không phải lúc nào cũng hoạt động. Ngoài ra, catđôi khi mang lại kết quả.

cat /proc/{PID}/fd/1

trong đó {PID} có thể được tra cứu bằng ps auxlệnh.

Cũng tốt để đề cập, là số ở cuối lệnh (trong trường hợp này là fd / 1) có thể được thay đổi cho các đầu ra khác.

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.