Чи можливо зчитувати вихід з будь-якого процесу, використовуючи його PID?


32

Чи можливо приєднати термінал до вже запущеного процесу, використовуючи його PID аналогічно використанню fgкоманди для завдань?


як що?! який процес ви хочете долучити ?!

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

Відповіді:


43

Ви можете отримати стандартні дескриптори файлів цього процесу, наприклад stdout:

tail -f /proc/<pid>/fd/1

8
Я спробував це рішення з вершиною, і, схоже, це не працює. У терміналі я запустив верх, а в іншому я використав вашу команду із загостреним підом, але не мав виводу.
Томмі

1
Як це зробити на mac?
Авнер Барр

що з stderr? Я припускаю / proc / <pid> / fd / 2, але як тоді ви отримуєте обидва stdout / stderr?
Олександр Міллс

1
Що робити, якщо цей дескриптор вказує на розетку? Хвіст не може його прочитати. # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Імаскар каже, що поверніть Моніку

8

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

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

В іншому випадку, якщо ви хочете, ви можете простежити процес і побачити, що він робить strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: Приєднайте до процесу PID ідентифікатора процесу та починайте трасування.
  • -s SIZE: Вкажіть максимальний розмір рядка для друку (за замовчуванням - 32).
  • -o filename: Запишіть вихідний слід у назву файлу, а не на екран (stderr).

Нарешті, здається, це не працює. Я запустив вершину, а в іншому я використав вашу команду із загостреним підом, але не отримав очікуваного результату. Коли згодом використовую хвіст.
Томмі

Вам потрібно використовувати sudostrace для приєднання до процесу, і використовувати -o ~/output.txtтак, щоб файл залишився у вашій домашній папці.

Використовуйте вихідний файл, не надсилайте на екран! Не будьте ідіотом, як я, і натисніть Ctrl-C, щоб вийти з напруги, а потім відключити мій PID. Налякав мене лайно на важливому сценарії.
Вестон Гангер

3

Ви можете використовувати ці команди, наведені нижче, щоб приєднати запущений процес до іншого терміналу:

  • retty(Сторінка людини: retty )
  • reptyr
  • screen

Приклад:

screen -S PID
retty $(pgrep PID)
reptyr PID

Мені не вдалося знайти ретти або повторне. Крім того, щоб мати змогу використовувати екран, я повинен запустити оригінальний процес з ним, щоб він не вирішив мою проблему.
Томмі

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