Как вернуть активный пользователь / сеанс на рабочем столе Linux?

Мой вопрос заключается в том, как получить имя пользователя в оболочке, которая в настоящее время использует рабочий стол Linux (в «нормальной» настольной системе, где обычно есть только один активный пользователь, то есть серверная система здесь, а только ваш обычный ноутбук и т. Д. .). Если вы действительно хотите представить себе серверную систему, мне будет хорошо, когда вы укажете всех активных пользователей.

Например, например, сценарий работает как root как задание cron (или аналогичное), и я хочу, чтобы все / активные пользователи в настоящее время были в системе.

Я знаю, что могу использовать w или who или users чтобы получить зарегистрированных пользователей. Это нормально, но этот пользователь вошел в систему, это не значит, что они на самом деле в настоящее время используют рабочий стол, потому что во всех настольных средах, которые, как я знаю, пользователи могут переключиться на другого пользователя после входа в систему.
Я также мог использовать last чтобы получить пользователя, который последний раз входил в систему, но это также не гарантирует, что этот пользователь все еще активен.

Итак, как это можно сделать? Прекрасно предоставлять конкретные решения для разных сред настольных компьютеров (GNOME, KDE, …), но, конечно, предпочтительным является кросс-совместимое решение.

Во многих текущих дистрибутивах сеансы входа (графические и неграфические) управляются logind . Вы можете перечислить сеансы, используя

 loginctl list-sessions 

а затем отобразить свойства каждого сеанса, используя

 loginctl show-session ${SESSIONID} 

или

 loginctl session-status ${SESSIONID} 

(заменяя соответственно ${SESSIONID} ); разница между этими двумя вариантами заключается в том, что show-session предназначен для простого анализа, session-status предназначен для потребления человеком. Активные сеансы идентифицируются по их состоянию; вы можете запросить это напрямую, используя

 loginctl show-session -p State ${SESSIONID} 

который будет выводить

 State=active 

для активного сеанса (ов). Полный вывод show-session будет сообщать вам, какой пользователь подключен, какой TTY используется, будь то удаленный сеанс, будь то графический сеанс и т. Д.

Обратите внимание, что logind может иметь несколько активных сеансов, если система настроена с несколькими местами, или если есть удаленные сеансы.

Соединяя это все вместе,

 for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }') do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid done 

предоставит всю необходимую информацию, чтобы определить, какие сессии активны, и кто их использует, и

 for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }') do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid | sort done | awk -F= '/Name/ { name = $2 } /User/ { user = $2 } /State/ { state = $2 } /Type/ { type = $2 } /Remote/ { remote = $2 } /User/ && remote == "no" && state == "active" && (type == "x11" || type == "wayland") { print user, name }' 

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

Я использую функцию bash, например следующую

 function Xowner() { for pid in $(ps -houid --ppid $(ps -hoppid $(pgrep X))) ; do [ "$pid" = "0" ] && continue id -n -u $pid break done } 

Намерение с этой функцией в основном состоит в том, чтобы выбрать «первый» не-корневой UID для параллельных процессов Xserver. Подробнее см. man ps . Я полагаю, если ваш случай использования потенциально связан с несколькими серверами X, вам нужно лучше сосредоточиться на том, с какого из них начать.

В большинстве Unix-подобных систем (говорит Википедия ) команда

 $ whoami 

дает имя текущего пользователя, выполняющего команду, например

 $ whoami dessert $ sudo whoami root