#!/bin/bash source /lib/rc/sh/functions.sh variable_value() { local varname=$1 /usr/libexec/calculate/cl-variable --value $varname } ONLINE_USERS="`variable_value desktop.cl_desktop_online_user`" # получить доменных пользователей которые не online, но их ресурсы подключены domain_users() { for mp in $(grep -Po "^//.*/homes\s+.*Home" /proc/mounts | awk '{print $2}');do local username=$(basename $(dirname $mp)) for user in ${ONLINE_USERS//,/ } do if [[ $user == $username ]] then username= fi done [[ -n $username ]] && echo $username done | sort | uniq } DOMAIN_USERS=( $(domain_users) ) # если есть пользователи в сеансе или выполняется выход if [[ -n $ONLINE_USERS ]] || [[ -n $DOMAIN_USERS ]] || pgrep -f 'xdm/xdm --logout' &>/dev/null then if [[ -n $ONLINE_USERS ]] || [[ -n $DOMAIN_USERS ]] then ebegin "Logout users" fi # есть пользователи в сеансе if [[ -n $ONLINE_USERS ]] then # переменная online_data возвращает строки пользователь,дисплей for user_disp in $(variable_value desktop.cl_desktop_online_data | sed -r "s/;/ /g") do user=$(echo $user_disp | cut -d: -f1) disp=$(echo $user_disp | cut -d: -f2) # завершаем сессию пользователя /usr/sbin/cl-core --method desktop_logout $user &>/dev/null sleep 1 # если корректное завершение не удалось if who | grep -q -P "$user.*:$disp" then # удаляем запить о пользователе /usr/bin/sessreg -d -l :$disp $user &>/dev/null # выполняем принудительный выход из сеанса USER="$user" /usr/share/calculate/xdm/xdm --logout &>/dev/null & fi done fi if [[ -n "${DOMAIN_USERS[@]}" ]] then for user in ${DOMAIN_USERS[@]} do # выполняем принудительный выход из сеанса USER="$user" /usr/share/calculate/xdm/xdm --logout &>/dev/null & done fi if [[ -n $ONLINE_USERS ]] || [[ -n $DOMAIN_USERS ]] then eend 0 fi # ожидаение завершения процесса выхода пользователя из сеанса if pgrep -f 'xdm/xdm --logout' &>/dev/null then ebegin "Please wait for complete logout" for i in {1..500} do if pgrep -f 'xdm/xdm --logout' &>/dev/null then sleep 1 else break fi done eend 0 fi fi