2009-04-03 2 views
72

Как бы я «подключил» консольный/терминал-просмотр к выводам приложений, чтобы я мог видеть, что он может сказать?Приложить к выходу процессов для просмотра

Как я могу отсоединиться от приложений, не убивая приложение?

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

+1

У вас есть символ отладки в вашем процессе? Работает ли он в сфере окружающей среды? И если вам это нужно, НИКОГДА не было приостановлено? –

+0

Когда у меня проблемы со стабильностью с программами конечного пользователя, такими как kino (сбой и убийство моего звука), я хочу знать, как/почему он разбился, поэтому я могу поработать над его исправлением. Это не программа, которую я разрабатываю, но технику, которую я хотел бы знать для устранения проблем. Я попробую ваше предложение ниже. – aggitan

ответ

6

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

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

+0

«Здесь есть несколько вариантов: один - перенаправить вывод команды в файл, а затем использовать« хвост »для просмотра новых строк, которые добавляются в этот файл в реальном времени». Можно ли это сделать с уже запущенными приложениями? – aggitan

+2

Возможно, вам понадобится tail -f $ log_file, чтобы получить результат, как он записан в файле. Кроме того, нет, я не знаю, как это сделать с уже запущенным приложением. – Varkhan

+0

@aggitan: Нет. Для существующих приложений вам придется перезапустить их, поскольку они уже привязали свой ввод-вывод к управляющему терминалу. –

4

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

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

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

redirecting-output-from-a-running-process

В основном:

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

Кстати, если вы работаете в ОС Linux на i386 поле, комментарии говорят о лучшем инструменте для перенаправления вывода на новую консоль: «retty». Если да, рассмотрите его использование.

28

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

strace -ewrite -p $PID 

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

я попробовал выход перенаправления, но это не работало для меня, maby, потому что процесс записывался в сокет, i dunno

+0

очень удобная команда, спасибо. – lenhhoxung

177

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

$ cd /proc/1199 

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

$ cd fd 

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

$ tail -f 1 
+8

Мне не удалось использовать 'tail', так как в моем случае вывод был перенаправлен на другой процесс для ввода, но' more' показал мне текущие данные. –

+0

@ Ωmega - Не могли бы вы найти процесс, в который вы перенаправляете его, а затем хвост его stdin (/ proc/#/0)? –

+0

В моей среде фактически 'tail' не работал ни в одном сценарии, только' head' и 'more' ... –

0

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

часов кошки/DEV/vcsa1

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

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