Додайте до результатів для перегляду


111

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

Як я можу відірватися від вихідних програм, не вбиваючи додаток?

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


1
Чи є у вас процес налагодження у вашому процесі? Чи працює він у виробничому середовищі? І якщо так, це вам потрібно, щоб НІКОЛИ не призупиняли?
Ів Баумес

Коли у мене виникають проблеми з стабільністю для таких програм кінцевих користувачів, як кіно (виходить з ладу і вбиває мій звук), я хочу знати, як / чому воно вийшло з ладу, щоб я міг працювати над його виправленням. Це не програма, яку я розробляю, але це техніка, яку я хотів би знати для зйомки неполадок. Я спробую вашу пропозицію нижче.
аггітан

Відповіді:


17

Тут є кілька варіантів. Перший - перенаправити висновок команди на файл, а потім використовувати «хвіст» для перегляду нових рядків, які додаються до цього файла в режимі реального часу.

Інший варіант - запустити свою програму всередині "екрана", який є свого роду текстовою програмою Terminal. Екранні сеанси можна приєднувати та від'єднувати, але номінально вони призначені лише тим самим користувачем, тому, якщо ви хочете поділитися ними між користувачами, це великий біль у дупі.


1
"Тут є кілька варіантів. Один - перенаправити вихід команди в файл, а потім використовувати" хвіст "для перегляду нових рядків, які додаються до цього файлу в режимі реального часу." Це можна зробити з уже запущеними програмами?
аггітан

2
Можливо, вам потрібен хвіст -f $ log_file, щоб отримати вихід, як він записаний у файлі. Крім того, ні, я не знаю, як це зробити з уже запущеним додатком.
Вархан

@aggitan: Ні. Для існуючих програм вам доведеться перезапустити їх, оскільки вони вже прив’язали свій введення-вивід до керуючого терміналу.
Дон Верве


288

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

$ cd /proc/1199

Потім шукайте fdкаталог під ним

$ cd fd

У цьому fdкаталозі містяться об’єкти файлових дескрипторів, якими користується ваша програма (0: stdin, 1: stdout, 2: stderr) і лише tail -fтой, який вам потрібен - у цьому випадку stdout):

$ tail -f 1

9
Мені не вдалося використати, tailоскільки в моєму випадку вихід був перенаправлений на інший процес для введення, але moreпоказав мені поточні дані.
Оммега

10
Один з найквітковіших публікацій на цьому сайті!
Роберт

2
moreпрацює на мене. ubuntu 14.04 на вузловому процесі
Shih-Min Lee

1
Це не працює для мене з процесом Java, який викликає System.out.println. Вихідні дані на / proc / [pid] / fd / 1
Nick

1
Спробував створити відтворення за допомогою наведеного нижче, але безрезультатно: `` `docker run -it --name container1 ubuntu bash -c -i" COUNT = 0; while true; do echo Продовжуйте бити танцпол; (( COUNT ++)); sleep 1; echo \ "Кількість: \ $ {COUNT} \"; виконано; " `` В іншому терміналі: `` `docker exec - це контейнер1 хвіст -f / proc / 1 / fd /
1`

54

Я шукав саме таку річ і виявив, що ти можеш зробити:

strace -ewrite -p $PID

Це не зовсім те, що вам потрібно, але це зовсім близько.

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


спасибі, він працює, але вихід урізаний, наприклад, для ping: write (1, "64 байт від 1.0.0.1: icmp_seq =" ..., 56) = 56
izy

8

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

Щодо цього питання, я знаю, що можна отримати результат, навіть коли ви не запускали команду sceen перед запуском процесу.

Хоча я ніколи не пробував цього, я знайшов цікаву статтю, в якій пояснюється, як робити GDB (і не перезавантажуючи процес).

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

В основному:

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

До речі, якщо ви працюєте на ОС Linux на i386, коментарі говорять про кращий інструмент для перенаправлення виводу на нову консоль: 'retty' . Якщо так, то врахуйте його використання.


6

Для мене це спрацювало:

  1. Увійти як власник процесу (навіть rootу дозволі відмовлено)

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

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

2

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

watch cat /dev/vcsa1

Очевидно, ви хочете використовувати vcsa2, vcsa3 тощо, залежно від того, який термінал використовувався.

Поки моє вікно терміналу було тієї ж ширини, що і термінал, на якому виконується команда, я можу бачити знімок їх поточного виходу кожні дві секунди. Інші команди, рекомендовані в інших місцях, не спрацювали особливо добре для моєї ситуації, але ця виконала трюк.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.