Присоединить к выводу процессов для просмотра - PullRequest
98 голосов
/ 04 апреля 2009

Как бы я "прикрепил" вид консоли / терминала к выходу приложения, чтобы я мог видеть, что он говорит?

Как бы я отключился от вывода приложения, не убивая приложение?

Обычно, если вы запускаете разговорное приложение, используя командную строку, вы видите все виды замечательных результатов. Однако, допустим, у меня запущено очень болтливое программирование, такое как KINO, и я хочу просматривать его результаты в любой момент без перезапуска через командную строку. Я не могу; по крайней мере, я не знаю как.

Ответы [ 5 ]

247 голосов
/ 22 июля 2013

Я думаю, у меня есть более простое решение. Просто найдите каталог, имя которого соответствует PID, который вы ищете, в псевдофайловой системе, доступной по пути /proc. Так что если у вас запущена программа с ID 1199, cd в ней:

$ cd /proc/1199

Затем найдите каталог fd под

$ cd fd

Этот каталог fd содержит объекты дескрипторов файлов, которые использует ваша программа (0: stdin, 1: stdout, 2: stderr) и просто tail -f тот, который вам нужен - в данном случае stdout):

$ tail -f 1
47 голосов
/ 07 декабря 2012

Я искал точно такую ​​же вещь и обнаружил, что вы можете сделать:

strace -ewrite -p $PID

Это не совсем то, что вам нужно, но это довольно близко.

Я попытался перенаправить вывод, но у меня это не сработало. Может быть, потому что процесс записывал в сокет, я не знаю.

13 голосов
/ 04 апреля 2009

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

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

6 голосов
/ 04 апреля 2009

Как бы я прикрепил консоль / терминал вид на вывод приложений, чтобы я мог видеть, что это может быть сказать?

Об этом вопросе я знаю, что можно перехватить вывод, даже если вы не запустили команду sceen до запуска процессуса.

Хотя я никогда не пробовал этого, я нашел интересную статью, в которой объясняется, как делать с помощью GDB (и без перезапуска вашего процесса).

перенаправление-выход-с-а-приработка процесса

В основном:

  1. Проверьте список открытых файлов для вашего процесса, благодаря / proc / xxx / fd
  2. Присоедините ваш процесс с помощью GDB
  3. Пока он приостановлен, закройте интересующий вас файл, вызвав функцию close () (вы можете использовать любую функцию вашего процесса в GDB. Я подозреваю, что вам нужны символы отладки в вашем процессе ..)
  4. Откройте новый файл, вызвав функцию create () или open (). (Посмотрите комментарии в конце, вы увидите, что люди предлагают использовать dup2 () , чтобы убедиться, что будет использоваться тот же дескриптор)
  5. Отключить процесс и запустить.

Кстати, если вы работаете в операционной системе linux на i386, комментарии говорят о лучшем инструменте для перенаправления вывода на новую консоль: retty . Если так, рассмотрите его использование.

1 голос
/ 08 октября 2014

Я хотел удаленно наблюдать за процессом обновления yum, который выполнялся локально, поэтому, хотя, возможно, были более эффективные способы сделать это, вот что я сделал:

watch cat /dev/vcsa1

Очевидно, вы захотите использовать vcsa2, vcsa3 и т. Д., В зависимости от того, какой терминал использовался.

Поскольку окно моего терминала было такой же ширины, что и терминал, на котором выполнялась команда, я мог видеть снимок их текущего вывода каждые две секунды. Другие команды, рекомендованные в других местах, не очень хорошо подходили для моей ситуации, но эта команда сделала свое дело.

...