См. Перенаправление 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 (стандартная ошибка). Обратите внимание, что в <stdio.h> также есть макросы C: 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
Сергей Федоров
источник