определение идентификатора рабочего стола или окна данного окна эмулятора терминала из PID

2003
intuited

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

Однако данный процесс терминала будет иметь несколько окон, распределенных по нескольким рабочим столам.

В roxtermэти дни я использую эмулятор терминала, хотя и Konsole, и gnome-терминал похожи в этом отношении.

Есть ли способ запросить одно или несколько из этих приложений, чтобы выяснить, в каком из их окон запущен данный процесс? Если это требует gdbвзлома, хорошо, взломать. Хотя что-то, что, вероятно, продолжит работать после обновления, вероятно, будет лучше :)

Я не совсем против отслеживания этих вещей при инициализации bash, но мне не хочется разбираться со всеми мрачными деталями, и, похоже, есть некоторые существенные крайние случаи, которые не будут работать с таким подходом. Хотя, может быть, кто-то уже понял это?

В качестве альтернативы, если есть другой эмулятор терминала, который предоставляет более богатый интерфейс для доступа к таким интроспективным данным, это было бы полезно знать.

Я мог бы обойти это, запустив каждое окно в отдельном процессе, но компромиссы как с точки зрения использования памяти, так и универсальности (например, перемещение вкладки из одного окна в другое), вероятно, неприемлемы. В основном это использование памяти.

1

1 ответ на вопрос

2
Gilles

Многие эмуляторы терминалов (в том числе rxvt, xterm, gnome-terminal и konsole; я не тестировал roxterm) устанавливают переменную окружения WINDOWIDдля идентификатора окна, в котором был запущен подпроцесс (например, оболочка). Так в Linux

</proc/$pid/environ tr \\0 \\n | sed -n 's/^WINDOWID=//p' 

говорит вам, в каком окне $pidработает

Это не будет работать, если процесс мигрировал между окнами, например, если он запущен под экраном или если вы мигрировали вкладки между окнами.

В самом деле. Это также означает, что я должен хранить его где-то как часть моего .bashrc и иметь дело с любыми странными несоответствиями. Однако полезно знать, что это более надежно, чем использование `wmctrl: ACTIVE:`. * edit *: .. err подожди, я просто просмотрел ответ. Хм, на самом деле это действительно полезно, спасибо. Может быть, я смогу запустить inotify для этих файлов ... ?? Это сумасшедшая идея? intuited 13 лет назад 0
Эффект наличия `screen` в игре интересен: это означает, что я на самом деле ищу * список * идентификаторов окон. Я собирался отпустить это, пока :) intuited 13 лет назад 0
эээ ... неважно, inotify не будет работать, если что-то в среде процесса не изменится, когда что-то подобное произойдет, в чем я сомневаюсь. Я должен был бы проверить родительскую среду (`screen`,` roxterm` и т. Д.) На наличие изменений, предполагая, что она отслеживает их, что кажется маловероятным. intuited 13 лет назад 0

Похожие вопросы