Як дізнатися, який процес пише в STDOUT?


19

У мене є два екземпляри запущеного процесу. Один з них - "ЗАРАЗ!" та помилки друку без зупинки для STDOUT.

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

Найбезпечніше було б розібратися, який процес / pid пише STDOUT.

Чи можна це зробити?


1
Запис у stdout означатиме написання до його дескриптора файлу 1 ((про процес, про який йдеться), який може бути як-небудь як термінал або /dev/null). Ви впевнені, що замість цього не маєте на увазі конкретний файл (наприклад, термінальний пристрій чи файл журналу ...)?
Стефан Шазелас

Якщо вони обидва були запущені в одній оболонці, вони обидва записують у STDOUT, тому закріплення цього не допоможе визначити, кого з 2 вбити. Метод Джофеля, ймовірно, те, що ви шукаєте.
slm

Що він насправді означає, це те, що виробляє вихід на терміналі .
Бармар

Відповіді:


17

У Linux, якщо припустити, що ви хочете знати, що пише на той же ресурс, до якого підключено макет вашої оболонки, ви можете зробити:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

Це повідомило б про write()системні виклики (на будь-якому дескрипторі файлу) кожного процесу, у якому відкритий принаймні один дескриптор файлу в тому ж файлі, що і fd 1 вашої оболонки.


Це те, що я мав на увазі спочатку, я спробую обидва методи завдяки вам обом.
TCZ8

23

Ви можете зупинити обидву обробку, надіславши їм SIGSTOP (замініть pid1 та pid2 фактичними PID- адресами або використовуйте killallта ім'я програми):

kill -SIGSTOP pid1 pid2

Друк на терміналі (або туди, куди перенаправлено стдут) повинен припинитися. Потім продовжуйте один із них, використовуючи

kill -SIGCONT pid1

Якщо повідомлення про помилку з’являються негайно, ви знаєте, що це перший процес. Якщо ні, ви можете зупинити це знову і продовжити другий ...

Перш ніж вбити зупинений процес, добре надіслати перший SIGCONT.

Той же метод може бути використаний з Ctrl-Zі контроль оболонки вакансії ( fg %1, bg %1, kill %1...).


1
Це дуже хороший спосіб вирішити його, але я дійсно шукав спосіб простежити, хто пише на термінал. Дякую
TCZ8

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