Как получить список весь активный X сессий и владельцы их

Bash выставляет стопку каталога в DIRSTACK переменная. Можно также использовать команду dirs +2 относиться к второй записи на стеке.

Более удобно, ~1 через ~9 обратитесь к девяти самым верхним записям на стеке. Таким образом, Ваш пример перевел бы в

chb$ cp ~2/baz.css ~/code/bar/view/static/css/

Zsh имеет то же ~n средство, и стек выставляется через названный массив dirstack. Bash dirs +2 zsh's print -r ~2 или print -r $dirstack[2].

5
13.04.2017, 15:36
2 ответа
[119299]Это решение для пользователей [119769]локальных[119770] X-серверов (игнорируя локальных X-клиентов с удаленными или виртуальными X-серверами).

Вы определяете PID диспетчера дисплея (который является родительским PID Xorg), определяете PID его дочерних процессов и определяете пользователя всех процессов, у которых один из них является родительским:

4
27.01.2020, 20:38

У меня была такая же проблема с уведомлением и отправкой.

Этот метод (также опубликованный здесь ) использует информацию о среде, которую предоставляет ps e . ps e -u имя пользователя | sed -rn 's /.* DISPLAY = (: [0-9] *). * / \ 1 / p ' выводит список всех номеров DISPLAY в средах всех процессов пользователя имя пользователя .

Если на вашем рабочем столе есть окно, принадлежащее пользователю root, то у пользователя root также будет несколько процессов с тем же номером DISPLAY, но в противном случае один DISPLAY должен быть связан только с одним пользователем. (Не наоборот - прямо сейчас я вошел в систему на двух терминалах с двумя сеансами X, поэтому я использую оба: 0 и: 1.)

Этот код выведет все используемые в настоящее время ДИСПЛЕИ (следовательно, все X сессий) всех вошедших в систему пользователей. (root пропускается)

Обратите внимание на sudo в команде ps : права root необходимы для просмотра окружения процессов других пользователей. Конечно, если скрипт запускается от root, в этом нет необходимости.

Имена пользователей и отображаемые числа используются в качестве индексов ассоциативных массивов для сохранения только уникальных значений.

#!/bin/bash

declare -A disps usrs
usrs=()
disps=()

for i in $(users);do
    [[ $i = root ]] && continue # skip root
    usrs[$i]=1
done # unique names

for u in "${!usrs[@]}"; do
    for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
        disps[$i]=$u
    done
done

for d in "${!disps[@]}";do
    echo "User: ${disps[$d]}, Display: $d"
    #sudo -u "${disps[$d]}" DISPLAY="$d" notify-send "Title" "Message"
done

Последняя закомментированная строка показывает, как можно вызвать notify-send.

2
27.01.2020, 20:38

Теги

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