Как определить, в какой xterm работает оболочка или процесс?

Обычно я использую длительные сеансы X с несколькими виртуальными рабочими столами и множеством xterms.

Я также использую управление заданиями в оболочке (zsh).

Иногда мне хотелось бы определить xterm, что оболочка или процесс запущены (или даже приостановлены) с помощью простой команды.

Например, вы редактируете файл с помощью vim и vim, предупреждая, что он уже открыт с другим экземпляром vim, который все еще работает. Но теперь вы забыли, в каком xterm этот vim с идентификатором процесса XYZ был запущен и приостановлен. Убийство не работает, потому что оно приостановлено. Возобновление его с помощью сигнала, а затем убийство может работать, но это может испортить процесс на переднем плане и, возможно, вы не хотите убивать экземпляр vim, потому что у него есть несколько окон, настроенных …

В настоящее время я использую awesomewm, но меня также интересуют решения для других wms.

Xterm помещает переменную WINDOWID в среду своего подпроцесса. Его значение – это идентификатор окна окна xterm. Не существует способа POSIX для запроса окружения процесса на основе его PID; вот Linux-способ запроса среды процесса $pid и извлечения переменной WINDOWID :

 </proc/$pid/environ gawk -v 'RS=\0' -F = '$1=="WINDOWID" {print $2}' 

Затем вы можете найти или действовать в окне с помощью wmctrl или через интерфейс вашего оконного менеджера.

Если вы используете экран, сначала попробуйте переменную STY , для которой задано имя сеанса экрана. Вы можете подключиться к этому сеансу с помощью screen -rd -S "$sessionname" .

Вы можете использовать ps -o ppid= PID для получения родительского идентификатора процесса PID, который, вероятно, будет оболочкой, которая запустила его. Идентификатор родительского элемента этой оболочки будет терминалом, содержащим его.


Чтобы проверить, я породил процесс, который оставался бы на некоторое время:

 $ sleep 5m & [1] 31177 

Затем я посмотрел на родителя процесса 31177 и какая команда:

 $ ps -o ppid= 31177 31107 $ ps -o cmd= 31107 zsh 

31107 – процесс zsh. Я запустил sleep 5m . Я повторил это в процессе zsh

 $ ps -o ppid= 31107 31097 $ ps -o cmd= 31097 xterm 

31097 – это xterm котором была запущена моя оболочка zsh


Если вы не знаете, насколько далеко вы хотите родителя, вы можете использовать его для поиска родителя с именем данной команды:

 pid="$1" cmd="$2" seek="" while [ "$seek" != "$cmd" ]; do # ps -o ppid= $pid pid=`ps -o ppid= $pid` seek=`ps -o cmd= $pid` if [ ${pid/ /} = 1 ]; then echo Reached the top of the tree exit 1 fi done echo $pid 

Контрольная работа:

 $ /tmp/find-parent 31177 xterm 31097