Дивіться перенаправлення STDOUT запущеного процесу


17

Якщо я запускаю програму з цією командою:

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

І команда не повертається, чи є спосіб з іншого підказки побачити, на що встановлено переспрямування STDOUT?

Я шукаю щось подібне

cat /proc/PID/redirects

або

ps -??? | grep PID

але будь-який метод зробить.

Відповіді:


22

Перевірте дескриптор файлу №1 (STDOUT) в /proc/$PID/fd/. Ядро представляє цей файл як символічне посилання на файл, на який перенаправлений дескриптор.

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

Ідеально! Спасибі! Чи можете ви надати посилання або детальну інформацію про інші переадресації, такі як STDERR, тобто які номери вони?
Багатий

Принаймні, для Linux (і я вважаю, що для всіх інших відомих UNIX-подібних ОС) вони становлять 0: stdin, 1: stdout, 2: stderr (стандартна помилка). Зауважте, що є також макроси C, визначені в <stdio.h>: STD {IN, OUT, ERR} _FILENO. Докладніше див. У розділі "man stdout".
Петро Узель

0, 1, 2 для stdin, stdout та stderr відповідно гарантуються у всіх Unix / Unix-подібних системах, а також вірно в Windows.
Пол Стеліан

на MacOS будь-яким способом це зробити? / proc / <pid> / fd / 1 не існує, можливо, я можу використовувати mkfifo?
Олександр Міллс

4

Корисний інструмент, щоб побачити, які файли відкриваються за допомогою яких процесів lsof . Ви можете вказати на конкретний процес за допомогоюlsof -p1234 , і ви побачите здебільшого ту саму інформацію, яку ви можете отримати ls -l /proc/1234/fdв Linux, тобто які файли відкриваються.

Найкорисніше 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.