Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

$ cd /proc/1199

Затем поищите fd каталог внизу

$ cd fd

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

$ tail -f 1

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

strace -ewrite -p $PID

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

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

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

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

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

перенаправление выходных данных из запущенного процесса

В основном:

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

Кстати, если вы используете ОС Linux на i386 box, в комментариях говорится о лучшем инструменте для перенаправления вывода на новую консоль : "ретти" .Если это так, подумайте о его использовании.

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

watch cat /dev/vcsa1

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

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

Для меня это сработало:

  1. Войдите в систему как владелец процесса (даже root отказано в разрешении)

    ~$ su - process_owner
    
  2. Используйте файловый дескриптор, как упоминалось во многих других ответах.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top