8.14.2010

Shell Scripts: Sencillo script con shutdown.

Muchas veces me ha sucedido que tengo que retirarme del computador pero se están realizando tareas en el mismo por lo que no se puede apagar. Obiavemente dejar prendido el computador indefinidamente no es una opción sensata por el malgasto de energía que eso significa. Lo que si se puede hacer es programar tiempo u hora de apagado en el cual sabemos que el equipo ya estará desocupado.



Para esto existe el comando shutdown. Su sintaxis es la siguiente:
# shutdown [-rhf] time [-t sec] [mensaje opcional]
Donde -rhf son las opciones de apagado; r (reboot) h (halt) f (fast reboot), existen más opciones pero estas son las más usadas. La segunda parte indica el tiempo en que queremos dar la orden, puede ser en hora local (HH:MM) o en un lapso de tiempo (en minutos). La tercera opción indica el tiempo en segundos del retraso que tendrá la advertencia y la ejecución de la orden de shutdown, útil sobre todo si existen varios usuarios logeados al sistema. Y por último se puede escribir un mensaje que aparecerá junto al mensaje de advertencia de shutdown, al igual que lo anterior resulta útil para por ejemplo decir porqué se tiene que apagar el sistema y por ejemplo en cuanto tiempo va a estar operativo nuevamente.

Ahora bien, el comando shutdown como era de esperarse solo puede ser ejecutado por el usuario root, por un usuario con capacidades de superusuario (es decir que se encuentre en el archivo sudoers) y por el/los usuarios indicados en el archivo shutdown.allow.

Entrando al tema del post, he escrito un pequeño script que hace uso de este comando para apagar el sistema ya sea en un lapso de tiempo, como a una hora específica. De momento el script es sumamente sencillo y no presenta gran diferencia de lo que sería ejecutar directamente el comando en un terminal, más que nada ha sido creado como una buena manera de practicar programación de shell scripts ;)

El script presentará primero el tipo de apagado que queremos, estos son: lapso de tiempo (countdown) u hora específica (timer). Luego nos pedirá el tiempo o la hora según la opción que hayamos elegido en el paso anterior y por último nos pedirá la clave de root para poder ejecutar el comando.

Conforme siga aprendiendo más cosas iré mejorando y ampliando las capacidades del script como por ejemplo poder programar un apagado basado en un fecha.

Pongo un link de descarga, así como el texto del script por si la primera opción deja de funcionar :)

File4shared: myshutdown_V0.1.final.sh
http://www.4shared.com/file/JORzdwUB/myshutdown_V01final.html

#!/bin/bash

# *************************************
# ***** Apagado programado V 0.1 ******
# *************************************

# Este script sirve para poder apagar el equipo
# en un determinado tiempo (countdown) o a una hora específica (schedule) basado en la hora del sistema
# Autor: Taoshi
# Feedback: tao.ceel_at_gmail_dot_com
# Website: tuxaudiovisual.blogspot.com

#Opciones de apagado
echo ""
echo "Elija el modo de apagado:"
echo "[1] Lapso de tiempo (en mins.)"
echo "[2] Hora determinada"
echo "[0] Salir"
read opcion
echo ""
case $opcion in
    1 ) read -p "Ingrese en cuanto desea apagar el equipo en minutos: " countdown;;
    2 ) read -p "Ingrese la hora de apagado del equipo: " timer;;
    0 ) exit;;
    * ) echo "Seleccione una opcion válida"
esac

if [ "$opcion" = "1" ]; then
    echo "************************************************************"
    echo "***** A elegido apagar el sistema en $countdown minutos ****"
    echo "************************************************************"
    echo "Se necesitan permisos de superusuario para proceder"
    echo "Por favor ingrese clave de root"
su - -c "shutdown -hP +$countdown now"
elif [ "$opcion" = "2" ]; then
    echo "****************************************************"
    echo "***** A elejido apagar el sistema a las $timer *****"
    echo "****************************************************"
    echo "Se necesitan permisos de super usuario para proceder"
    echo "Por favor ingrese clave de root"
su - -c "shutdown -hP $timer -t 30"
fi
# Salir del script si la clave es incorrecta
if [ $? -ne 0 ]; then
    echo "Clave incorrecta, saliendo del script.."
    exit 1
fi
exit 0

# Todo-list:
# - Verificar correcto formato de $time ingresado (HH:MM)
# - Mostar tiempo de apagado (en hora local) luego de ejecutar el comando shutdown.
# - Mostar el tiempo restante de apagado en cuenta regresiva.
# - Barra de progreso para lo anterior?
# - Opción dentro del script para cancelar el shutdown.
# - Opciones a elegir para pasar a shutdown como -r (reboot), -n (whitout init), etc..
# - GUI o notificaciones?? (libnotify, glade, zenity, python???)
Espero les sea de utilidad y no duden en comentar cualquier cosa!

Saludos!