Scripts shell útiles en cualquier programa Por elav <° Linux – 2 marzo, 2012Publicado 2012Publicado en: GNU/Linux GNU/Linux,, Terminal Terminal,, Tutoriales/Manuales/Tips Excelente artículo publicado en CodeNinja en el cual podemos ver pedazos de código que nos serán de utilidad para crearnos nuestros Scripts.. Se los dejo textualmente a continuación. Bash es un programa informático cuya función consiste en interpretar órdenes. Está basado en la shell de Unix y fue escrito para el proyecto GNU siendo el intérprete de comandos por defecto en la mayoría GNU/Linux. Su nombre es un acrónimo de Bourne-Again Shell (otro shell de las distribuciones de GNU/Linux. (sh), bourne), bourne) , haciendo un juego de palabras (born-again significa renacimiento) sobre el Bourne shell (sh), que fue uno de los primeros intérpretes importantes de Unix. Hoy vamos a mostrar algunos scripts de shell que pueden ser de gran utilidad para los desarrolladores. Unix, aunque algunos requieren que sean ejecutados La mayoría funcionan en cualquier shell de Unix, Bash. específicamente por Bash.
Evitar que usuarios sin privilegios ejecuten el script Algunos scripts realizan tareas administrativas por lo cual podríamos querer que solo el usuario root ejecute el script. En ese caso podemos usar algo como esto:
#!/bin/bash if [[ $EUID -ne 0 ]]; then echo "Este script debe ser ejecutado por el usuario root" 1>&2 exit 1 fi
Permitir la ejecución del script solo a un usuario específico De manera similar al código anterior, podríamos querer que solo un usuario específico ejecute el script. Lo hacemos así:
#!/bin/bash AUTHORIZED_USER="usuario_permitido" if [ $USER != $AUTHORIZED_USER ]; then echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2 exit 1 fi
Verificar que un servicio/proceso se está ejecutando Si queremos saber si existen procesos de algún servicio o programa ejecutándose podríamos usar este script (en este caso verifica que el demonio de Apache esté corriendo): corriendo) :
#!/bin/sh SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null then echo "El servicio $SERVICE esta ejecutandose" else echo "Chanfle! El servicio $SERVICE esta detenido" fi
Crear un archivo de bloqueo A veces debemos asegurarnos que el script no se ejecute dos o más veces simultáneas. Para ello podemos hacer uso de los archivos de bloqueo. Esta es una versión sencilla de un script que nos permite hacer esto:
#!/bin/bash lockfile=/var/lock/loquesea.lock if [ ! -e $lockfile ]; then touch $lockfile echo "hago muchas cosas importantes aqui" rm $lockfile else echo "ya hay otro proceso corriendo" fi En este caso, se verifica que el archivo loquesea.lock exista. En caso de que exista, el script NO ejecuta sus tareas. Si no existe, crea el archivo, ejecuta las tareas que deba ejecutar y lo elimina. Pero, esto no es del todo fiable. ¿Qué pasaría si mientras nuestro script se está ejecutando es cerrado abruptamente? En ese caso el archivo de bloqueo no se borraría, y por lo tanto, no nos permitiría ejecutar el script de nuevo. Para cubrir esos casos, podríamos hacer uso del comando trap que nos permite ejecutar comandos en caso que nuestro script termine de manera inesperada. Esta es una versión más avanzada que además guarda dentro del archivo de bloqueo el PID del script que lo ejecuta:
#!/bin/bash lockfile=/var/lock/loquesea.lock if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; then trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT echo "hago muchas cosas aqui tranquilamente" rm -f "$lockfile" trap - INT TERM EXIT else echo "Ya hay otro proceso de este script ejecutandose" echo "corriendo con el PID: $(cat $lockfile)" fi Entendamos un poco mejor el comando trap. La sintaxis del mismo es básicamente esta: trap comando signal [signal ...]; donde signal es la señal de terminación que quieres atrapar. Si quieres ver una lista de los signals disponibles puedes ejecutar el comando kill -l. Para el caso anterior se usaron los signals INT (captura la terminación producida por un Ctrl+c) , TERM (terminación producida por el comando kill) y EXIT (terminación normal de un script, bien sea porque ya no hay más líneas que
ejecutar o porque se encuentra con el comando exit) .
Menú de opciones Para hacer un menú en donde permitimos al usuario seleccionar una serie de opciones podemos usar el siguiente esquema:
#!/bin/bash clear while : do echo " Escoja una opcion " echo "1. quien soy?" echo "2. cuanto espacio tengo" echo "3. que es esto?" echo "4. Salir" echo -n "Seleccione una opcion [1 - 4]" read opcion case $opcion in 1) echo "este eres:"; whoami;; 2) echo "tienes esto"; df;; 3) uname -r;; 4) echo "chao"; exit 1;; *) echo "$opc es una opcion invalida. Es tan dificil?"; echo "Presiona una tecla para continuar..."; read foo;; esac done
Pedir confirmación antes de ejecutar un script A veces es útil hacer que el usuario confirme la ejecución de un lote de sentencias, es decir, el típico mensaje que pide al usuario escribir yes o no. Esto lo podemos hacer así:
#!/bin/bash while true; do echo read -p "esta seguro de hacer lo que sea que vaya a hacer " yn case $yn in yes ) break;; no ) exit;; * ) echo "por favor responda yes o no";; esac done echo "si se ejecuta esto es que aceptaste"
Fin del artículo. Sencillamente genial Edito: Hay que tener cuidado con los espacios y tabulaciones, que por algún motivo, no me están saliendo ¬¬