Прикрепить к выводам процессов для просмотра
-
23-08-2019 - |
Вопрос
Как бы мне "прикрепить" представление консоли / терминала к выходу приложения, чтобы я мог видеть, что оно может говорить?
Как бы мне отсоединиться от выходных данных приложения, не убивая приложение?
Обычно, если вы запускаете разговорное приложение с помощью командной строки, вы видите всевозможные замечательные результаты.Однако, допустим, у меня запущено особенно болтливое программирование, такое как 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 (и без перезапуска вашего процесса).
перенаправление выходных данных из запущенного процесса
В основном:
- Проверьте список открытых файлов для вашего процесса, благодаря /proc/xxx/fd
- Прикрепить ваш процесс с помощью GDB
- Пока он приостановлен, закройте интересующий вас файл, вызвав закрыть() функция (вы можете использовать любую функцию вашего процесса в GDB.Я подозреваю, что вам нужны символы отладки в вашем процессе ..)
- Откройте новый файл, вызвав создать() или функция open().(Загляните в комментарии в конце, вы увидите, что люди предлагают использовать dup2() чтобы гарантировать, что будет использоваться одна и та же ручка)
- Отсоединить завершите процесс и дайте ему запуститься.
Кстати, если вы используете ОС Linux на i386 box, в комментариях говорится о лучшем инструменте для перенаправления вывода на новую консоль : "ретти" .Если это так, подумайте о его использовании.
Я хотел удаленно наблюдать за процессом обновления yum, который был запущен локально, поэтому, хотя, вероятно, существовали более эффективные способы сделать это, вот что я сделал:
watch cat /dev/vcsa1
Очевидно, что вы хотели бы использовать vcsa2, vcsa3 и т.д., в зависимости от того, какой терминал использовался.
Пока окно моего терминала было той же ширины, что и окно терминала, на котором выполнялась команда, я мог видеть моментальный снимок их текущего вывода каждые две секунды.Другие команды, рекомендованные в других местах, не особенно хорошо подходили для моей ситуации, но эта сделала свое дело.
Для меня это сработало:
Войдите в систему как владелец процесса (даже
root
отказано в разрешении)~$ su - process_owner
Используйте файловый дескриптор, как упоминалось во многих других ответах.
~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)