Можно ли прочитать выходные данные любого процесса, используя его PID?

32

Можно ли подключить терминал к уже запущенному процессу, используя его PID аналогично использованию fgкоманды для заданий?

Томми
источник
Как что?! какой процесс вы хотите присоединить ?!
Я хотел бы иметь возможность просматривать выходные данные программы, которая была запущена в другом терминале
Томми

Ответы:

43

Вы можете получить стандартные файловые дескрипторы этого процесса, например stdout:

tail -f /proc/<pid>/fd/1
Хорхе Кастро
источник
8
Я пробовал это решение с верхом, и, похоже, оно не работает. В терминале я запустил top, а в другом я использовал вашу команду с corred pid, но ничего не получил.
Томми
1
Как вы делаете это на Mac?
Авнер Барр
как насчет stderr? Я предполагаю / proc / <pid> / fd / 2, но тогда как вы получаете оба stdout / stderr?
Александр Миллс
1
Что если этот дескриптор указывает на сокет? Хвост не может прочитать это. # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Имаскар говорит восстановить Монику
8

Здесь есть несколько вариантов. Один из них - перенаправить вывод команды в файл, а затем использовать его tailдля просмотра новых строк, добавляемых в этот файл в режиме реального времени.

Другой вариант - запустить вашу программу внутри screen, которая является своего рода текстовым терминальным приложением. Сеансы экрана можно прикреплять и отсоединять, но номинально они предназначены для использования одним и тем же пользователем, поэтому если вы хотите поделиться ими между пользователями.

Иначе, если вы хотите, вы можете проследить процесс и посмотреть, что он делает strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: Присоедините к процессу с идентификатором процесса PID и начните трассировку.
  • -s SIZE: Укажите максимальный размер строки для печати (по умолчанию 32).
  • -o filename: Записать вывод трассировки в имя файла, а не на экран (stderr).
OLORIN
источник
В конце концов, это не похоже на работу. Я запустил top и в другом я использовал вашу команду с corred pid, но не получил ожидаемый результат. Когда я использую хвост потом.
Томми
Вам нужно использовать sudostrace для присоединения к процессу, и использовать -o ~/output.txtтак, чтобы файл оставался в вашей домашней папке.
Используйте выходной файл, не отправляйте на экран! Не будь таким идиотом, как я, и нажми Ctrl-C, чтобы выйти из строя, а затем отключи мой PID. Напугал меня до чертиков по важному сценарию.
Уэстон Гангер
3

Вы можете использовать эти команды, приведенные ниже, чтобы присоединить запущенный процесс к другому терминалу:

  • retty(Man страница: retty )
  • reptyr
  • screen

Пример:

screen -S PID
retty $(pgrep PID)
reptyr PID
devav2
источник
Я не смог найти ретти или репти. Кроме того, чтобы иметь возможность использовать экран, я должен запустить оригинальный процесс с ним, чтобы он не решил мою проблему.
Томми
Вы можете установить его с помощью команды, sudo apt-get install rettyно у retty есть несколько ограничений. Проверьте справочную страницу, упомянутую в ответе.
devav2