# ACPI script botón de power (Probadlo a ver que os parece)

## aj2r

Aquí os pongo un script que he diseñado para el funcionamiento del botón de power con ACPI:

```

#!/bin/sh

THIS=$0

MAX_WAIT=5 #segundos de espera

PATH_TO_SESSIONS=/tmp/.ICE-unix

LOCK=/var/run/console

ENCODE=nonexisting

APAGAR=0

if [ $# -eq 0 ]; then

   

   #la primera vez

   chmod a-x $THIS

   find $LOCK -type f -exec mv {} {}$ENCODE \;

   XLOCK=`ls /tmp/.X*-lock`

   if [ ${#XLOCK} -gt 0 ]; then

      USUARIOS=`who | cut -f 1 -d " "| sort -u`

      for USUARIO in $USUARIOS; do

         AUX=`sh $THIS $USUARIO`

         let "APAGAR+=`echo $AUX | grep -c 1`"

      done

      logger "Sesiones de entorno gráfico cerradas"

      chmod a+x $THIS

      cd $LOCK

      rename s/$ENCODE// *

   fi

   if [ $APAGAR -lt 1 ]; then

      #listo para apagar

      logger "Apagando el sistema"

      chmod a+x $THIS

      cd $LOCK

      rename s/$ENCODE// *

      /sbin/init 0

   fi

else

   USUARIO=$1

   SESIONES_X=`ls /tmp/.X*-lock | cut -b 8`

   if [ ${#SESIONES_X} -gt 0 ]; then

      logger "Cerrando sesiones para el usuario $USUARIO"

      for D in $SESIONES_X; do

         DISPLAY=":$D"

      #determinando la consola

         CONSOLA=`cat /var/log/Xorg.$D.log | grep -i 'using vt number' | cut -f 5 -d ' '`

      #sesiones a partir de XDM

         SESIONES=`utmp | grep /dev/$DISPLAY | grep $USUARIO`

         if [ ${#SESIONES} -gt 0 ]; then

            SESION=`echo $SESIONES | cut -f 2 -d ' '`

         #comprobando si el usuario está en una sesión de gnome

            IN_GNOME=`ps aux | grep gnome-session | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

         #comprobando si el usuario está en una sesión de XFCE4

            IN_XFCE4=`ps aux | grep xfce4-session | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

         #comprobando si el usuario está en una sesión de KDE

            IN_KDE=`ps aux | grep [k]desktop | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

            if [ $IN_GNOME -gt 0 ] || [ $IN_XFCE4 -gt 0 ] || [ $IN_KDE -gt 0 ]; then

            #determinando SESSION_MANAGER

               SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESION

               if [ $IN_GNOME -gt 0 ]; then

                  logger "Cerrando sesión de gnome del usuario $USUARIO"

                  chvt $CONSOLA

                  su - $USUARIO -c "(

                     export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                     xscreensaver-command -deactivate &> /dev/null

                     gnome-session-save --kill &> /dev/null

                     )"

               elif [ $IN_XFCE4 -gt 0 ]; then

                  logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

                  chvt $CONSOLA

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                     xfce4-session-logout  &> /dev/null

                     )"

               elif [ $IN_KDE -gt 0 ]; then

                  logger "Cerrando sesión de KDE del usuario $USUARIO"

                  chvt $CONSOLA

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                     dcop kdesktop default logout &> /dev/null

                     )"

               fi

               INDEX=0

               while `test -e $PATH_TO_SESSIONS/$SESION` && [ $INDEX -lt $MAX_WAIT ]; do

                  INDEX=$(($INDEX+1))

                  sleep 1

               done

               if `test -e $PATH_TO_SESSIONS/$SESION`; then

                  logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

               fi

               echo 1

            else

            #Gestor de ventanas desconocido

               logger "Gestor desconocido"

               chvt $CONSOLA

               su - $USUARIO -c "env DISPLAY=$DISPLAY zenity --info --text \"Gestor desconocido\"" &> /dev/null

               echo 0

            fi

      #sesiones no iniciadas a partir de un XDM

         else

            PID=`cat /tmp/.X$D-lock`

            LINEA=`ps -ej | grep $PID`

            SID=`echo $LINEA | cut -d " " -f 3`

            GNOME=`ps u -ej | grep $SID | grep gnome-session | grep $USUARIO`

            KDE=`ps u -ej | grep $SID | grep [k]desktop | grep $USUARIO`

            XFCE4=`ps u -ej | grep $SID | grep xfce4-session | grep $USUARIO`

            XDM=`ps u -ej | grep $SID | grep [xgk]dm | grep $USUARIO`

            

            if [ ${#GNOME} -gt 0 ] || [ ${#XFCE4} -gt 0 ] || [ ${#KDE} -gt 0 ]; then

               chvt $CONSOLA

               if [ ${#GNOME} -gt 0 ]; then

                  SESSION_MANAGER_PID=`echo $GNOME | cut -d " " -f 2`

echo $SESSION_MANAGER_PID

                  logger "Cerrando sesión de gnome del usuario $USUARIO"

                  su - $USUARIO -c "(

                     export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                     xscreensaver-command -deactivate &> /dev/null

                     gnome-session-save --kill &> /dev/null

                     )"

               elif [ ${#XFCE4} -gt 0 ]; then

                  SESSION_MANAGER_PID=`echo $XFCE4 |cut -d " " -f 2`

                  logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                     xfce4-session-logout &> /dev/null

                     )"

               elif [ ${#KDE} -gt 0 ]; then

                  SESSION_MANAGER_PID=`echo $KDE |cut -d " " -f 2`

                  logger "Cerrando sesión de KDE del usuario $USUARIO"

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                     dcop kdesktop default logout &> /dev/null

                     )"

               fi

               INDEX=0

               while `test -e $PATH_TO_SESSIONS/$SESSION_MANAGER_PID` && [ $INDEX -lt $MAX_WAIT ]; do

                  INDEX=$(($INDEX+1))

                  sleep 1

               done

               if `test -e $PATH_TO_SESSIONS/$SESSION_MANAGER_PID`; then

                  logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

               fi

            elif [ ${#XDM} -gt 0 ]; then

               logger "Detectada sesión de XDM"

            else

            #Gestor de ventanas desconocido

               logger "Gestor de ventanas no iniciado o desconocido en el display $DISPLAY"

            fi

            echo 0

         fi

      done

   fi

fi   

```

Os cuento un poco lo que hace: Usuario por usuario mira a ver si tiene iniciada una sesión con gnome, kde o xfce4 y si es así muestra el menú de logout, si no tienes iniciada una sesión X en tu sistema o en las X sólo está ejecutándose un XDM el sistema se apaga.

PROBADLO por favor, decidme que os parece y si queréis aconsejadme modificaciones.

Yo lo he probado en mil situaciones doferentes pero sólo con gnome y gdm.

Para el que no sepa como usarlo lo primero es tener el demonio acpid funcionando en el sistema y luego en el archivo /etc/acpi/default.sh tener algo parecido a esto:

```

#!/bin/sh

# Default acpi script that takes an entry for all actions

set $*

group=${1/\/*/}

action=${1/*\//}

case "$group" in

   button)

      case "$action" in

         power)                                             // Esta parte es

            /etc/acpi/actions/lm_power.sh   // la que 

            ;;                                            // interesa.

         lid)

            /etc/acpi/actions/lm_lid.sh

            ;;

         *)   logger "ACPI la acción $action no está definida"

            ;;

      esac

      ;;

   *)

      logger "ACPI group $group / action $action is not defined"

      ;;

esac

```

Luego con vuestro editor preferido creáis el archivo /etc/acpi_actions/lm_power.sh y ponéis el texto del script.

Le dáis derechos de ejecución

```
chmod a+x lm_power.sh
```

Todo lo anterior como root claro.

Y ya a probar!!

Lo único que le falla es que no lo hace con todos los usuarios a la vez sino de uno en uno (la verdad no se si es un fallo o conviene más así).Last edited by aj2r on Mon Sep 26, 2005 10:51 am; edited 1 time in total

----------

## aj2r

Nadie lo prueba??   :Confused: 

----------

## Stolz

 *aj2r wrote:*   

> Nadie lo prueba??  

 

Si nadie responde es obvio que no  :Wink: , o al menos, si lo hacen, no tienen nada que comentar. No hace falta hacer 'Ups' cuando un mensaje aun está en la primera pagina, ya lo leerá la gente o llegará a él a traves de la busqueda, no te impacientes que seguro que le es útil a alguien, parece muy currado.

Tal vez con un titulo mas adecuado....  :Wink: 

Saludozzzzz

----------

## pcmaster

Hola

Yo sí lo he probado. El que pusiste en el otro post no me funcionaba, pero este sí. Quizá has cambiado algo o yo hice algo mal, no lo sé.

Es que no sé por qué, si copio el texto con el ratón en Firefox, luego al pegarlo:

- si uso nano en una ventana de texto, bien,

- pero si uso vim, no sé por qué añade tabuladores a saco. A la primera linea le añade uno, y cada vez más,  ala última le tuve que quitar QUINCE líneas de tabuladores.

Bueno, alfinal tengo el script funcionando, aunque solo lo he probado una vez, al pulsar el botoón de encendido me ha salido el cuadro de diálogo para cerrar XFCE4.

Una sugerencia. donde pone:

```
        #comprobando si el usuario está en una sesión de KDE

        IN_KDE=`ps aux | grep [k]desktop | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

        if [ $IN_GNOME -gt 0 ] || [ $IN_XFCE4 -gt 0 ] || [ $IN_KDE -gt 0 ]; then

          #determinando SESSION_MANAGER

          SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESION

          if [ $IN_GNOME -gt 0 ]; then

            logger "Cerrando sesión de gnome del usuario $USUARIO"

            chvt $CONSOLA

            su - $USUARIO -c "(

                export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                xscreensaver-command -deactivate &> /dev/null

                gnome-session-save --kill &> /dev/null

            )"

          elif [ $IN_XFCE4 -gt 0 ]; then

            logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

            chvt $CONSOLA

            su - $USUARIO -c "(

                export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                xfce4-session-logout  &> /dev/null

            )"

          elif [ $IN_KDE -gt 0 ]; then

            logger "Cerrando sesión de KDE del usuario $USUARIO"

            chvt $CONSOLA

            su - $USUARIO -c "(

                export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                dcop kdesktop default logout &> /dev/null

            )"

          fi

          INDEX=0

          while `test -e $PATH_TO_SESSIONS/$SESION` && [ $INDEX -lt $MAX_WAIT ]; do

            INDEX=$(($INDEX+1))

            sleep 1

          done

          if `test -e $PATH_TO_SESSIONS/$SESION`; then

            logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

          fi

          echo 1

        else
```

las 3 líneas que ponen chvt $CONSOLA pueden sacarse del if-elif, ya que se ejecuta en los 3 casos en los cuales las condiciones if-elif se ejecutan, y quedar así:

```
        #comprobando si el usuario está en una sesión de KDE

        IN_KDE=`ps aux | grep [k]desktop | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

        if [ $IN_GNOME -gt 0 ] || [ $IN_XFCE4 -gt 0 ] || [ $IN_KDE -gt 0 ]; then

          #determinando SESSION_MANAGER

          SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESION

          chvt $CONSOLA

          if [ $IN_GNOME -gt 0 ]; then

            logger "Cerrando sesión de gnome del usuario $USUARIO"

            su - $USUARIO -c "(

                export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                xscreensaver-command -deactivate &> /dev/null

                gnome-session-save --kill &> /dev/null

            )"

          elif [ $IN_XFCE4 -gt 0 ]; then

            logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

            su - $USUARIO -c "(

                export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                xfce4-session-logout  &> /dev/null

            )"

          elif [ $IN_KDE -gt 0 ]; then

            logger "Cerrando sesión de KDE del usuario $USUARIO"

            su - $USUARIO -c "(

                export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                dcop kdesktop default logout &> /dev/null

            )"

          fi

          INDEX=0

          while `test -e $PATH_TO_SESSIONS/$SESION` && [ $INDEX -lt $MAX_WAIT ]; do

            INDEX=$(($INDEX+1))

            sleep 1

          done

          if `test -e $PATH_TO_SESSIONS/$SESION`; then

            logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

          fi

          echo 1

        else
```

----------

## pcmaster

Acabo de encontrar un error:

Si pulso el interruptor del PC, sale la ventanita de XFCE4 preguntando si quiero salir de XFCE4.

Si pulso el botón Aceptar, sale y apaga,

pero si pulso Cancelar, NO sale... y apaga igualmente

Por cierto, ¿para qué sirve la orden let en un script de bash?

 *Quote:*   

> for USUARIO in $USUARIOS; do
> 
>           AUX=`sh $THIS $USUARIO`
> 
>           let "APAGAR+=`echo $AUX | grep -c 1`"
> ...

 

----------

## DDrDark

Este script se podria adaptar a FVWM?

----------

## aj2r

let sirve para realizar operaciones aritméticas.

Y si, si se podría adaptar a cualquier otro gestor de ventanas con saber como se llama el proceso de éste y cual es el código que hace falta para que muestre la ventanita de logout.

Lo de que de todas formas se apague si que es un fallo   :Confused:   Seguramente no usas un XDM, verdad? Simplemente en vez de poner un 1 había puesto un 0   :Laughing:  Bueno, a ver si así os gusta más   :Wink: 

```

#!/bin/sh

THIS=$0

MAX_WAIT=5 #segundos de espera

PATH_TO_SESSIONS=/tmp/.ICE-unix

LOCK=/var/run/console

ENCODE=nonexisting

APAGAR=0

if [ $# -eq 0 ]; then

   

   #la primera vez

   chmod a-x $THIS

   find $LOCK -type f -exec mv {} {}$ENCODE \;

   XLOCK=`ls /tmp/.X*-lock`

   if [ ${#XLOCK} -gt 0 ]; then

      USUARIOS=`who | cut -f 1 -d " "| sort -u`

      for USUARIO in $USUARIOS; do

         AUX=`sh $THIS $USUARIO`

         let "APAGAR+=`echo $AUX | grep -c 1`"

      done

      logger "Sesiones de entorno gráfico cerradas"

      chmod a+x $THIS

      cd $LOCK

      rename s/$ENCODE// *

   fi

   if [ $APAGAR -lt 1 ]; then

      #listo para apagar

      logger "Apagando el sistema"

      chmod a+x $THIS

      cd $LOCK

      rename s/$ENCODE// *

      /sbin/init 0

   fi

else

   USUARIO=$1

   SESIONES_X=`ls /tmp/.X*-lock | cut -b 8`

   if [ ${#SESIONES_X} -gt 0 ]; then

      logger "Cerrando sesiones para el usuario $USUARIO"

      for D in $SESIONES_X; do

         DISPLAY=":$D"

      #determinando la consola

         CONSOLA=`cat /var/log/Xorg.$D.log | grep -i 'using vt number' | cut -f 5 -d ' '`

      #sesiones a partir de XDM

         SESIONES=`utmp | grep /dev/$DISPLAY | grep $USUARIO`

         if [ ${#SESIONES} -gt 0 ]; then

            SESION=`echo $SESIONES | cut -f 2 -d ' '`

         #comprobando si el usuario está en una sesión de gnome

            IN_GNOME=`ps aux | grep gnome-session | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

         #comprobando si el usuario está en una sesión de XFCE4

            IN_XFCE4=`ps aux | grep xfce4-session | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

         #comprobando si el usuario está en una sesión de KDE

            IN_KDE=`ps aux | grep [k]desktop | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

            chvt $CONSOLA

            if [ $IN_GNOME -gt 0 ] || [ $IN_XFCE4 -gt 0 ] || [ $IN_KDE -gt 0 ]; then

            #determinando SESSION_MANAGER

               SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESION

               if [ $IN_GNOME -gt 0 ]; then

                  logger "Cerrando sesión de gnome del usuario $USUARIO"

                  su - $USUARIO -c "(

                     export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                     xscreensaver-command -deactivate &> /dev/null

                     gnome-session-save --kill &> /dev/null

                     )"

               elif [ $IN_XFCE4 -gt 0 ]; then

                  logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                     xfce4-session-logout  &> /dev/null

                     )"

               elif [ $IN_KDE -gt 0 ]; then

                  logger "Cerrando sesión de KDE del usuario $USUARIO"

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                     dcop kdesktop default logout &> /dev/null

                     )"

               fi

               INDEX=0

               while `test -e $PATH_TO_SESSIONS/$SESION` && [ $INDEX -lt $MAX_WAIT ]; do

                  INDEX=$(($INDEX+1))

                  sleep 1

               done

               if `test -e $PATH_TO_SESSIONS/$SESION`; then

                  logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

               fi

               echo 1

            else

            #Gestor de ventanas desconocido

               logger "Gestor desconocido"

               su - $USUARIO -c "env DISPLAY=$DISPLAY zenity --info --text \"Gestor desconocido\"" &> /dev/null

               echo 0

            fi

      #sesiones no iniciadas a partir de un XDM

         else

            PID=`cat /tmp/.X$D-lock`

            LINEA=`ps -ej | grep $PID`

            SID=`echo $LINEA | cut -d " " -f 3`

            GNOME=`ps u -ej | grep $SID | grep gnome-session | grep $USUARIO`

            KDE=`ps u -ej | grep $SID | grep [k]desktop | grep $USUARIO`

            XFCE4=`ps u -ej | grep $SID | grep xfce4-session | grep $USUARIO`

            XDM=`ps u -ej | grep $SID | grep [xgk]dm | grep $USUARIO`

            

            if [ ${#GNOME} -gt 0 ] || [ ${#XFCE4} -gt 0 ] || [ ${#KDE} -gt 0 ]; then

               chvt $CONSOLA

               if [ ${#GNOME} -gt 0 ]; then

                  SESSION_MANAGER_PID=`echo $GNOME | cut -d " " -f 2`

echo $SESSION_MANAGER_PID

                  logger "Cerrando sesión de gnome del usuario $USUARIO"

                  su - $USUARIO -c "(

                     export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                     xscreensaver-command -deactivate &> /dev/null

                     gnome-session-save --kill &> /dev/null

                     )"

               elif [ ${#XFCE4} -gt 0 ]; then

                  SESSION_MANAGER_PID=`echo $XFCE4 |cut -d " " -f 2`

                  logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                     xfce4-session-logout &> /dev/null

                     )"

               elif [ ${#KDE} -gt 0 ]; then

                  SESSION_MANAGER_PID=`echo $KDE |cut -d " " -f 2`

                  logger "Cerrando sesión de KDE del usuario $USUARIO"

                  su - $USUARIO -c "( 

                     export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                     dcop kdesktop default logout &> /dev/null

                     )"

               fi

               INDEX=0

               while `test -e $PATH_TO_SESSIONS/$SESSION_MANAGER_PID` && [ $INDEX -lt $MAX_WAIT ]; do

                  INDEX=$(($INDEX+1))

                  sleep 1

               done

               if `test -e $PATH_TO_SESSIONS/$SESSION_MANAGER_PID`; then

                  logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

               fi

               echo 1

            elif [ ${#XDM} -gt 0 ]; then

               logger "Detectada sesión de XDM"

               echo 0

            else

            #Gestor de ventanas desconocido

               logger "Gestor de ventanas no iniciado o desconocido en el display $DISPLAY"

               echo 1

            fi

         fi

      done

   fi

fi      

```

----------

## aj2r

Hay un fallillo más   :Laughing:  Pero basta con cambiar en la inicialización de USUARIOS 'who' por 'ps u -e' y ya tá.

----------

## aj2r

Mejor así:

```

#!/bin/sh

THIS=$0

MAX_WAIT=5 #segundos de espera

PATH_TO_SESSIONS=/tmp/.ICE-unix

LOCK=/var/run/console

ENCODE=nonexisting

APAGAR=0

#la primera vez que se ejecuta

if [ $# -eq 0 ]; then

    chmod a-x $THIS

    find $LOCK -type f -exec mv {} {}$ENCODE \;

    XLOCK=`ls /tmp/.X*-lock`

    if [ ${#XLOCK} -gt 0 ]; then

        USUARIOS=`who | cut -f 1 -d " " | sort -u`

        if [ `who | grep -c root` -lt 1 ]; then

            USUARIOS="$USUARIOS root"

        fi

        for USUARIO in $USUARIOS; do

            AUX=`sh $THIS $USUARIO`

            let "APAGAR+=`echo $AUX | grep -c 1`"

        done

        logger "Sesiones de entorno gráfico cerradas"

    fi

        chmod a+x $THIS

        cd $LOCK

        rename s/$ENCODE// *

    if [ $APAGAR -lt 1 ]; then

        #listo para apagar

        logger "Apagando el sistema"

        /sbin/init 0

    fi

else

    USUARIO=$1

    SESIONES_X=`ls /tmp/.X*-lock | cut -b 8`

    if [ ${#SESIONES_X} -gt 0 ]; then

       logger "Cerrando sesiones para el usuario $USUARIO"

        for D in $SESIONES_X; do

            DISPLAY=":$D"

            #determinando la consola

            CONSOLA=`cat /var/log/Xorg.$D.log | grep -i 'using vt number' | cut -f 5 -d ' '`

            #sesiones a partir de XDM

            SESIONES=`utmp | grep /dev/$DISPLAY | grep $USUARIO`

            if [ ${#SESIONES} -gt 0 ]; then

                SESION=`echo $SESIONES | cut -f 2 -d ' '`

                #comprobando si el usuario está en una sesión de gnome

                IN_GNOME=`ps aux | grep gnome-session | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

                #comprobando si el usuario está en una sesión de XFCE4

                IN_XFCE4=`ps aux | grep xfce4-session | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

                #comprobando si el usuario está en una sesión de KDE

                IN_KDE=`ps aux | grep [k]desktop | grep -v ssh-agent | grep -v grep | grep -c $USUARIO`

                chvt $CONSOLA

                if [ $IN_GNOME -gt 0 ] || [ $IN_XFCE4 -gt 0 ] || [ $IN_KDE -gt 0 ]; then

                    #determinando SESSION_MANAGER

                    SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESION

                    if [ $IN_GNOME -gt 0 ]; then

                        logger "Cerrando sesión de gnome del usuario $USUARIO"

                        su - $USUARIO -c "(

                            export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                            xscreensaver-command -deactivate &> /dev/null

                            gnome-session-save --kill &> /dev/null

                            )"

                    elif [ $IN_XFCE4 -gt 0 ]; then

                        logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

                        su - $USUARIO -c "( 

                            export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                            xfce4-session-logout  &> /dev/null

                            )"

                    elif [ $IN_KDE -gt 0 ]; then

                        logger "Cerrando sesión de KDE del usuario $USUARIO"

                        su - $USUARIO -c "( 

                            export DISPLAY=$DISPLAY SESSION_MANAGER=$SESSION_MANAGER

                            dcop kdesktop default logout &> /dev/null

                            )"

                    fi

                    INDEX=0

                    while `test -e $PATH_TO_SESSIONS/$SESION` && [ $INDEX -lt $MAX_WAIT ]; do

                        INDEX=$(($INDEX+1))

                        sleep 1

                    done

                    if `test -e $PATH_TO_SESSIONS/$SESION`; then

                        logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

                    fi

                    echo 1

                    else

                        #Gestor de ventanas desconocido

                        logger "Gestor desconocido"

                        su - $USUARIO -c "env DISPLAY=$DISPLAY zenity --info --text \"Gestor desconocido\"" &> /dev/null

                        echo 0

                    fi

      #sesiones no iniciadas a partir de un XDM

                else

                    PID=`cat /tmp/.X$D-lock`

                    LINEA=`ps -ej | grep $PID`

                    SID=`echo $LINEA | cut -d " " -f 3`

                    GNOME=`ps u -ej | grep $SID | grep gnome-session | grep $USUARIO`

                    KDE=`ps u -ej | grep $SID | grep [k]desktop | grep $USUARIO`

                    XFCE4=`ps u -ej | grep $SID | grep xfce4-session | grep $USUARIO`

                    XDM=`ps u -ej | grep $SID | grep [xgk]dm | grep $USUARIO`

            

                    if [ ${#GNOME} -gt 0 ] || [ ${#XFCE4} -gt 0 ] || [ ${#KDE} -gt 0 ]; then

                        chvt $CONSOLA

                        if [ ${#GNOME} -gt 0 ]; then

                            SESSION_MANAGER_PID=`echo $GNOME | cut -d " " -f 2`

                            logger "Cerrando sesión de gnome del usuario $USUARIO"

                            su - $USUARIO -c "(

                                export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                                xscreensaver-command -deactivate &> /dev/null

                                gnome-session-save --kill &> /dev/null

                                )"

                        elif [ ${#XFCE4} -gt 0 ]; then

                            SESSION_MANAGER_PID=`echo $XFCE4 |cut -d " " -f 2`

                            logger "Cerrando sesión de XFCE4 del usuario $USUARIO"

                            su - $USUARIO -c "( 

                                export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                                xfce4-session-logout &> /dev/null

                                )"

                        elif [ ${#KDE} -gt 0 ]; then

                            SESSION_MANAGER_PID=`echo $KDE |cut -d " " -f 2`

                            logger "Cerrando sesión de KDE del usuario $USUARIO"

                            su - $USUARIO -c "( 

                                export DISPLAY=$DISPLAY SESSION_MANAGER=local/$HOSTNAME:$PATH_TO_SESSIONS/$SESSION_MANAGER_PID

                                dcop kdesktop default logout &> /dev/null

                                )"

                        fi

                        INDEX=0

                        while `test -e $PATH_TO_SESSIONS/$SESSION_MANAGER_PID` && [ $INDEX -lt $MAX_WAIT ]; do

                            INDEX=$(($INDEX+1))

                            sleep 1

                        done

                        if `test -e $PATH_TO_SESSIONS/$SESSION_MANAGER_PID`; then

                            logger "Cerrando - no ha sido posible cerrar la sesión X para el usuario $USUARIO"

                        fi

                    echo 1

                elif [ ${#XDM} -gt 0 ]; then

                    logger "Detectada sesión de XDM"

                    echo 0

                else

                    #Gestor de ventanas desconocido

                    logger "Gestor de ventanas no iniciado o desconocido en el display $DISPLAY"

                    echo 0

                fi

            fi

        done

    fi

fi

```

----------

## pacho2

aj2r: Cuando pueda lo probaré, estos días estoy atareado, lo siento

En referencia a lo que se comantaba sobre la adaptación a fvwm supongo que si le pudieras decir el comando que sirve para salir limpiamente de fvwm quizás lo podría añadir...

Saludos  :Wink: 

----------

## pcmaster

Si estoy en modo texto, apaga.

Si estoy en X, sale de las X pero NO apaga.

inicio las X con startx, no GDM.

----------

## aj2r

Entonces funcina como debiera  :Very Happy: 

----------

