Присоединить к выходу процессов для просмотра

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

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

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

Ответ 1

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

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

Ответ 2

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

$ cd /proc/1199

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

$ cd fd

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

$ tail -f 1

Ответ 3

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

strace -ewrite -p $PID

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

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

Ответ 4

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

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

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

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

В принципе:

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

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

Ответ 5

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

watch cat /dev/vcsa1

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

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

Ответ 6

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

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

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

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)