SDDM & много одновременных сессий

Модераторы: broom, aim

Аватара пользователя
denel
Сообщения: 463
ОС: Gentoo Linux

SDDM & много одновременных сессий

Сообщение denel » 08.11.2019 23:22

Столкнулся с интересным поведением SDDM/KDE... При попытке запустить пятую, а чаще даже только четвёртую сессию, функциональность SDDM по переключению пользователей и по запуску новых сессий прекращается. То есть уже не даёт выбор, на какую запущенную сессию переключаться и не запускает новую сессию. По ps в момент запуска последней сессии, когда всё срывается, вывод

Код: Выделить всё

 3464     1 /usr/bin/sddm
 3613  3464 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 1 --start /usr/bin/startkde --user ...
 5319  3464 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 7 --start /usr/bin/startkde --user ...
 5686  3464 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 9 --start /usr/bin/startkde --user ...
 6256  3464 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 11 --start /usr/bin/startkde --user ...
Превращается в

Код: Выделить всё

 3613     1 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 1 --start /usr/bin/startkde --user ...
 5319     1 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 7 --start /usr/bin/startkde --user ...
 5686     1 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 9 --start /usr/bin/startkde --user ...
 6256     1 /usr/libexec/sddm-helper --socket /tmp/sddm-authcf9ca378-912b-4e8d-8cf3-5f8017557927 --id 11 --start /usr/bin/startkde --user ...
То есть вылетает родительский процесс «3464 1 /usr/bin/sddm»
При этом по показаниям nvidia-settings
Used Dedicated Memory начинает вплотную приближаться (91-100%) к Total Dedicated Memory 981MB
Значит ему не хватает видеопамяти? Он что, все VT держит в видеопамяти? Это как-то можно победить? Или же причина мною неправильно опознана?
Спасибо сказали:

Аватара пользователя
denel
Сообщения: 463
ОС: Gentoo Linux

Re: SDDM & много одновременных сессий

Сообщение denel » 17.11.2019 10:22

Что-то толи обновил, толи сделал (скорее обновил)... В общем перестала наблюдаться указанная ситуация, процесс sddm перестал вылетать, несмотря на занятость видеопамяти. Зато теперь при переключении пользователей не выводит список этих пользователей, уже вошедших в систему вообще, только есть возможность либо разблокировать учётку, в которой было вызвано меню переключения пользователей, либо Начать новый сеанс... Конечно можно побегать по Ctrl+Alt+F#, но хочется удобней сделать...
ck-list-sessions при этом выводит список всех активных (вошедших) пользователей, по крайней мере в графику. Сделал скрипт для переключения пользователя из разблокированной учётки

Код: Выделить всё

#!/bin/bash
n=-1
out=$(ck-list-sessions | while read -a src; do
  if [[ "${src[0]}" == "Session"* ]]; then
    ((n++))
  elif [[ "${src[0]}" == "unix-user" ]]; then
    uid[$n]=${src[2]#\'}
    uid[$n]=${uid[$n]%\'}
    ifs=$IFS
    IFS=:
    string=( $(grep "^[^:]*:x:${uid[$n]}" /etc/passwd) )
    IFS=$ifs
    login[$n]=${string[0]}
    fio[$n]=${string[4]}
  elif [[ "${src[0]}" == "session-state" ]]; then
    state[$n]=${src[2]#\'}
    state[$n]=${state[$n]%\'}
  elif [[ "${src[0]}" == "is-local" ]]; then
    islocal[$n]=${src[2]#\'}
    islocal[$n]=${islocal[$n]%\'}
  elif [[ "${src[0]}" == "VTNr" ]]; then
    vt[$n]=${src[2]#\'}
    vt[$n]=${vt[$n]%\'}
  fi
  for a in ${!uid[@]}; do
    name=${login[$a]}
    [[ -n ${fio[$a]} ]] && name=${fio[$a]}
    [[ ${islocal[$a]} == TRUE ]] && \
     [[ ${state[$a]} == online ]] && \
      echo -n "${name}#${vt[$a]}:"
  done
  echo
done | tail -n1)

IFS=:
out=( $out )
IFS=$ifs
for a in ${!out[@]}; do
  string="${string} ${out[$a]#*#} \"${out[$a]%#*}\" off"
done
string="$string 0 \"Новый сеанс\" off"
vt=$(eval kdialog --radiolist \"Выберите сеанс\" $string) || exit
if [[ $vt == 0 ]]; then
  qdbus org.kde.screensaver /org/freedesktop/ScreenSaver org.kde.screensaver.SwitchUser
else
  qdbus org.kde.screensaver /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.Lock
  sudo /usr/local/bin/switch_user_vt.sh $vt # здесь chvt $1 и соответствующая запись в sudoerc для беспарольного выполнения
fi
Но вот если сеанс заблокирован - до этого меню ведь не добраться. Как можно прикрутить что-то подобное, своё, к экрану блокировки, на котором сейчас имеется возможность только ввести пароль к текущему сеансу или начать новый сеанс?
Спасибо сказали:

Аватара пользователя
denel
Сообщения: 463
ОС: Gentoo Linux

Re: SDDM & много одновременных сессий

Сообщение denel » 19.11.2019 01:33

Отказался от consolekit, перешёл на elogind. В итоге переключение пользователей начало работать как надо (появляется список пользователей, уже вошедших в систему). И позволяет войти четырём пользователям в систему без проблем.
Подкорректировал для elogind скрипт переключения пользователей из разблокированной учётки:

Код: Выделить всё

#!/bin/bash
n=-1
out=$(loginctl --no-legend | while read session uid login a
do
  active=$(loginctl show-session -p Active $session)
  displ=$(loginctl show-session -p Display $session)
  [[ $active == *"yes" ]] && continue
  ifs=$IFS
  IFS=:
  string=( $(grep "^[^:]*:x:${uid}:" /etc/passwd) )
  IFS=$ifs
  fio=${string[4]}
  name=${login}
  [[ -n ${fio} ]] && name=${fio}
  out="${out}:${fio}#$((${displ#*:}+7))"
  echo $out
done | tail -n1)

IFS=:
out=( ${out#:} )
IFS=$ifs
for a in ${!out[@]}; do
  string="${string} ${out[$a]#*#} \"${out[$a]%#*}\" off"
done
string="$string 0 \"Новый сеанс\" off"
vt=$(eval kdialog --radiolist \"Выберите сеанс\" $string) || exit
if [[ $vt == 0 ]]; then
  qdbus org.kde.screensaver /org/freedesktop/ScreenSaver org.kde.screensaver.SwitchUser
else
  qdbus org.kde.screensaver /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.Lock
  sudo /usr/local/bin/switch_user_vt.sh $vt # здесь chvt $1 и соответствующая запись в sudoerc для беспарольного выполнения
fi
Спасибо сказали: