Как узнать, какой процесс пишет в STDOUT?

19

У меня есть два экземпляра запущенного процесса. Одним из них является "ОТКРЫТИЕ!" и ошибки печати без остановки на STDOUT.

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

Самое безопасное - выяснить, какой процесс / pid пишет в STDOUT.

Есть ли способ сделать это?

TCZ8
источник
1
Запись в stdout будет означать запись в его файловый дескриптор 1 ((рассматриваемого процесса), который может быть чем-то вроде терминала или /dev/null). Вы уверены, что не имеете в виду конкретный файл (например, терминальное устройство или файл журнала ...)?
Стефан Шазелас
Если они оба были запущены в одной и той же оболочке, то они оба пишут в STDOUT, поэтому закрепление этого кода не поможет вам определить, кого из 2 убить. Метод Джофеля, скорее всего, то, что вы ищете.
СЛМ
На самом деле он имеет в виду, какой из них производит вывод на терминале .
Бармар

Ответы:

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...).

jofel
источник
1
Это очень хороший способ устранения неполадок, но я действительно искал способ отследить, кто пишет в терминал. Спасибо
TCZ8
Просто перечитывал этот вопрос, похоже, у меня был пердеть мозг при написании моего последнего комментария. Это также решило бы мою проблему. Спасибо.
TCZ8