Linux Avanzado

Un asterisco (*) en cualquier posición indica que se admite cualquier valor. Por ejemplo, para ejecutar una tarea a la m
109KB Größe 74 Downloads 132 Ansichten
Linux Avanzado

Tema 7: Automatización; Scripts y Cron Programación de trabajos

En esta sección, usted aprenderá a: • Usar los comandos cron o anacron para ejecutar trabajos cada intervalos regulares. • Usar el comando at para ejecutar trabajos en un momento específico. • Gestionar trabajos cron y at • Configurar el acceso de los usuarios a los servicios cron y at En la sección anterior, analizamos el comando logrotate y vimos la necesidad de ejecutarlo de manera periódica. Usted también tendrá la necesidad de ejecutar comandos de manera regular en las dos próximas secciones sobre servicios de copias de seguridad y hora de red. Éstas son sólo algunas de las tantas tareas administrativas que se deben realizar frecuente y regularmente. En esta sección, usted aprenderá sobre las herramientas que se usan para automatizar la programación periódica de trabajos y sobre las herramientas que se usan para ejecutar un trabajo en un momento específico.

Ejecución de trabajos en intervalos regulares La ejecución de trabajos en intervalos regulares se gestiona con la facilidad cron, que incluye el daemon crond y un conjunto de tablas que describen qué trabajo se debe realizar, en qué momento y con qué frecuencia. El daemon entra en funcionamiento una vez por minuto y verifica el crontabs para determinar qué es necesario hacer. Los usuarios gestionan los crontabs usando el comando crontab. El daemon crond se suele ejecutar por medio del proceso init cuando se inicia el sistema. Para no complicar esto, supongamos que usted desea ejecutar el comando que figura en el Listado 28 con una frecuencia regular. En realidad, este comando no hace nada salvo informar sobre el día y la hora, pero ilustra cómo usar crontab para configurar trabajos cron y sabremos cuándo se lo ejecutó desde los datos de salida. Para configurar las entradas de crontab, es necesario contar con una cadena con metacaracteres shell escapados. Por lo tanto, la mejor forma de hacer esto es mediante comandos y parámetros simples. Por eso, en este ejemplo, el comando echo se ejecutará desde un script /home/ian/mycrontab.sh, que no tiene ningún parámetro. Esto ahorra trabajo con los caracteres de escape. Listado 28. Ejemplo de un comando simple [ian@lyrebird ~]$ cat mycrontest.sh #!/bin/bash echo "It is now $(date +%T) on $(date +%A)" [ian@lyrebird ~]$ ./mycrontest.sh It is now 18:37:42 on Friday

Creación de un crontab Para crear un crontab, usted debe usar el comando crontab con la opción -e (que se refiere a "edit" [editar]). Esto abrirá el editor vi, a menos que usted haya especificado otro editor en la variable de entorno EDITOR o VISUAL. Cada entrada de crontab incluye los siguientes seis campos: 1. Minuto 2. Hora 3. Día del mes 4. Mes del año 5. Día de la semana 6. Cadena a ejecutar por sh

1

Los minutos y las horas van de 0 a 59 y de 0 a 23 respectivamente. El día del mes y el mes del año van de 1 a 31 y de 1 a 12 respectivamente. El día de la semana va de 0 a 6 (0 hace referencia al día domingo). El día de la semana también se puede especificar como sun, mon, tue, etc. (dom, lun, mar, etc.). Al sexto campo, que es todo lo que se encuentra luego del quinto campo, se lo interpreta como una cadena que se pasará a sh. El signo % se transfiere a una nueva línea. Por lo tanto, si desea incluir un % o cualquier otro carácter especial, precédalo por una barra invertida (\). La línea hasta el primer signo % se transfiere al shell, mientras que todas las líneas que se encuentra luego del signo % se transfieren como datos de entrada estándar. Los diversos campos relacionados con la hora pueden especificar un valor individual, un rango de valores (como, por ejemplo, 0-10 o sun-wed [lun-mie]) o una lista de valores y rangos individuales separados por comas. Por lo tanto, una entrada de crontab algo artificial para nuestro comando a modo de ejemplo puede aparecer en el Listado 29. Listado 29. Un ejemplo de crontab simple 0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh

En este ejemplo, nuestro comando se ejecuta en los minutos 0, 20 y 40 (es decir, cada 20 minutos) entre las 22 hs. y las 24 hs. los días viernes y los días sábados del mes de julio. Vea la pagina man correspondiente a crontab(5) para mayor información sobre las formas adicionales de especificar las horas.

¿Qué pasa con los datos de salida? Es probable que se pregunte qué pasa con los datos de salida del comando. La mayoría de los comandos diseñados para que se los use con la facilidad cron registrarán los datos de salida usando la facilidad syslog que analizamos en la sección anterior. Sin embargo, todos los datos de salida que se direccionen a stdout se enviarán por correo electrónico al usuario. El Listado 30 le muestra los datos de salida que usted podría recibir de nuestro comando a modo de ejemplo. Listado 30. Datos de salida de cron enviados por correo electrónico From [email protected] Fri Jul 6 23:00:02 2007 Date: Fri, 6 Jul 2007 23:00:01 -0400 From: [email protected] (Cron Daemon) To: [email protected] Subject: Cron /home/ian/mycrontest.sh Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: It is now 23:00:01 on Friday

¿Dónde está mi crontab? El crontab que usted creó con el comando crontab se almacena en /etc/spool/cron debajo del nombre del usuario que lo creó. Por lo tanto, el crontab que figura con anterioridad se almacena en

2

/etc/spool/cron/ian. Por esto, a usted no lo sorprenderá saber que el comando crontab, al igual que el comando passwd que discutimos con anterioridad, es un programa suid que se ejecuta con autoridad de usuario raíz. /etc/crontab Además de los archivos crontab del usuario en /var/spool/cron, cron también verifica /etc/crontab y los archivos en el directorio /etc/cron.d. Estos crontabs de sistema tienen un campo adicional entre la quinta entrada (día) y el comando. Este campo adicional especifica el usuario para quien el comando se debería ejecutar (generalmente, el usuario raíz). Un /etc/crontab puede tener el aspecto del ejemplo que figura en el Listado 31. Listado 31. /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly

En este ejemplo, el trabajo real lo realiza el comando run-parts, que ejecuta scripts desde /etc/cron.hourly, /etc/cron.daily, etc. /etc/crontab simplemente controla la frecuencia de los trabajos recurrentes. Tenga en cuenta que todos los comandos que figuran aquí se ejecutan como raíz. También tenga en cuenta que el crontab puede incluir asignaciones de variables shell que se configurarán antes de que se ejecuten los comandos.

Anacron La facilidad cron funciona bien para el caso de los sistemas que funcionan de manera continua. En el caso de los sistemas que están apagados la mayor parte del tiempo (como, por ejemplo, las laptops), otra facilidad, anacron (que significa "cron anasincrónico") se puede ocupar de programar los trabajos, lo que la facilidad cron suele realizar con una frecuencia diaria, semanal o mensual. Anacron no se ocupa de los trabajos por hora. Anacron conserva los archivos de fecha y hora en /var/spool/anacron para poder registrar cuándo se ejecutan los trabajos. Cuando se ejecuta anacron, éste verifica si transcurrió la cantidad necesaria de días desde que el trabajo se ejecutó por última vez y lo ejecuta de ser necesario. La tabla de trabajos para anacron se almacena en /etc/anacrontab, que tiene un formato levemente diferente al del /etc/crontab. Como en el caso de /etc/crontab, es posible que /etc/anacrontab incluya configuraciones del entorno. Cada trabajo tiene cuatro campos. 1. period (período) 2. delay (retraso) 3. job-identifier (identificador del trabajo) 4. command (comando) El período es una cantidad de días, pero se puede especificar como @monthly para garantizar que un trabajo sólo se ejecute una vez por mes sin importar la cantidad de días que tenga el mes. El retraso es la cantidad de minutos que usted debe esperar desde el momento que el trabajo está listo para ejecutarse hasta que se ejecuta efectivamente. Usted puede usar esto para evitar una inundación de tareas cuando un sistema se inicia por primera vez. El identificador de tareas puede incluir cualquier carácter no en blanco con la excepción de las barras (/). Tanto /etc/crontab como /etc/anacrontab se actualizan por edición directa. Usted no utiliza el comando crontab para actualizar estos archivos y los archivos en el directorio /etc/cron.d.

3

Ejecución de trabajos en un momento específico A veces, es posible que usted necesite ejecutar un trabajo sólo una vez en vez de con una frecuencia regular. Para estos casos, usted usa el comando at. Los comandos que se ejecutarán se leen de un archivo especificado con la opción -f, o de stdin si no se usa -f. La opción -m envía un correo electrónico al usuario, incluso si no hay stdout del comando. La opción -v visualiza la hora en la que el trabajo se ejecutará antes de leer el trabajo. La hora también se visualiza en los datos de salida. El Listado 32 le muestra un ejemplo de cómo se ejecuta el script mycrontest.sh que usted usó con anterioridad. El Listado 33 le muestra los datos de salida que se envían por correo electrónico al usuario luego de ejecutar el trabajo. Tenga en cuenta que estos datos de salida son relativamente más compactos que los datos de salida correspondientes al trabajo cron. Listado 32. Uso del comando at [ian@lyrebird ~]$ at -f mycrontest.sh -v 10:25 Sat Jul 7 10:25:00 2007 job 5 at Sat Jul 7 10:25:00 2007

Listado 33. Datos de salida del trabajo desde at From [email protected] Sat Jul 7 10:25:00 2007 Date: Sat, 7 Jul 2007 10:25:00 -0400 From: Ian Shields Subject: Output from your job 5 To: [email protected] It is now 10:25:00 on Saturday

Las especificaciones horarias pueden resultar bastante complicadas. El Listado 34 le muestra algunos ejemplos. Vea la página man en relación con at o el archivo /usr/share/doc/at/timespec, o un archivo como /usr/share/doc/at-3.1.10/timespec, donde 3.1.10 en este ejemplo es la versión del paquete at. Listado 34. Valores horarios con el comando at [ian@lyrebird ~]$ at -f mycrontest.sh 10pm tomorrow job 14 at Sun Jul 8 22:00:00 2007 [ian@lyrebird ~]$ at -f mycrontest.sh 2:00 tuesday job 15 at Tue Jul 10 02:00:00 2007 [ian@lyrebird ~]$ at -f mycrontest.sh 2:00 july 11 job 16 at Wed Jul 11 02:00:00 2007 [ian@lyrebird ~]$ at -f mycrontest.sh 2:00 next week job 17 at Sat Jul 14 02:00:00 2007

El comando at también tiene una opción -q. Al incrementar la cola, se incrementa el valor del trabajo. También hay un comando batch, que es similar al comando at, excepto por el hecho de que los trabajos se ejecutan sólo cuando la carga del sistema es lo suficientemente baja. Vea las páginas man para mayor información sobre estas características.

4

Gestión de trabajos programados Listado de trabajos programados Usted puede gestionar sus trabajos cron y at. Use el comando crontab con la opción -l para visualizar una lista de su crontab y use el comando atq para visualizar los trabajos que usted puso en cola usando el comando at (como se puede observar en el Listado 35). Listado 35. Visualización de trabajos programados [ian@lyrebird ~]$ crontab -l 0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh [ian@lyrebird ~]$ atq 16 Wed Jul 11 02:00:00 2007 a ian 17 Sat Jul 14 02:00:00 2007 a ian 14 Sun Jul 8 22:00:00 2007 a ian 15 Tue Jul 10 02:00:00 2007 a ian

Si desea revisar el comando que se programó para su ejecución mediante el uso de at, usted puede usar el comando at con la opción -c y el número de trabajo. Usted verá que la mayor parte del entorno que estaba activo cuando se emitió el comandoat se guarda junto con el trabajo programado. El Listado 36 le muestra parte de los datos de salida correspondientes al trabajo 15. Listado 36. Uso de at -c con un número de trabajo #!/bin/sh # atrun uid=500 gid=500 # mail ian 0 umask 2 HOSTNAME=lyrebird.raleigh.ibm.com; export HOSTNAME SHELL=/bin/bash; export SHELL HISTSIZE=1000; export HISTSIZE SSH_CLIENT=9.67.219.151\ 3210\ 22; export SSH_CLIENT SSH_TTY=/dev/pts/5; export SSH_TTY USER=ian; export USER ... HOME=/home/ian; export HOME LOGNAME=ian; export LOGNAME ... cd /home/ian || { echo 'Execution directory inaccessible' >&2 exit 1 } ${SHELL:-/bin/sh} /dev/null|LC_ALL=C tr -d -c '[:alnum:]')` #!/bin/bash echo "It is now $(date +%T) on $(date +%A)"

Tenga en cuenta que los contenidos de nuestro archivo script se copiaron como un documento here que se ejecutará por medio del shell especificado por la variable SHELL o por /bin/sh si no se configuró la variable SHELL.

5

Borrado de trabajos programados Usted puede borrar todos los trabajos cron programados usando el comando cron con la opción r (como se puede observar en el Listado 37). Listado 37. Visualización y borrado de trabajos cron [ian@lyrebird ~]$ crontab -l 0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh [ian@lyrebird ~]$ crontab -r [ian@lyrebird ~]$ crontab -l no crontab for ian

Para borrar los trabajos cron o anacron del sistema, edite /etc/crontab, /etc/anacrontab o edite o borre los archivos en el directorio /etc/cron.d. Usted puede borrar uno o más trabajos programados con el comando at usando el comando atrm con el número de trabajo. Los trabajos múltiples se deberían separar con espacios. El Listado 38 le muestra un ejemplo de esto. Listado 38. Visualización y eliminación de trabajos con atq y atrm [ian@lyrebird ~]$ atq 16 Wed Jul 11 02:00:00 2007 a ian 17 Sat Jul 14 02:00:00 2007 a ian 14 Sun Jul 8 22:00:00 2007 a ian 15 Tue Jul 10 02:00:00 2007 a ian [ian@lyrebird ~]$ atrm 16 14 15 [ian@lyrebird ~]$ atq 17 Sat Jul 14 02:00:00 2007 a ian

Configuración del acceso de usuarios a la programación de trabajos Si existe el archivo /etc/cron.allow, todos los usuarios que no sean el usuario raíz deben figurar en dicho archivo para que puedan usar crontab y la facilidad cron. Si no existe /etc/cron.allow pero existe /etc/cron.deny, todos los usuarios que no sean el usuario raíz y figuren en dicho archivo no podrán usar crontab o la facilidad cron. Si ninguno de estos dos archivos existe, sólo el súper usuario podrá usar este comando. Un archivo /etc/cron.deny vacío permite a todos los usuarios usar la facilidad cron y es lo que viene configurado de manera predeterminada. Los archivos /etc/at.allow y /etc/at.deny correspondientes tienen un efecto similar para la facilidad at.

Automatización de tareas periódicas Configuración de cron El daemon cron sirve para ejecutar comandos de forma periódica. Puede usar cron para una gran variedad de tareas programadas de limpieza y mantenimiento, y de administración de sistemas. Si existe un evento o tarea que deba ocurrir de forma regular, cron deberá controlarlo/a. Cron se activa una vez por minuto y verifica si debe realizar alguna acción, pero no puede realizar una tarea más de una vez por minuto (si necesita que una tarea se realice más de una vez por minuto, deberá usar un daemon en lugar de un trabajo cron). Cron registra sus acciones en la facilidad syslog.

6

Cron revisa varios puntos en busca de archivos de configuración que contengan configuraciones de entorno y comandos a ejecutar. El primero es /etc/crontab, que contiene tareas de sistemas. El directorio /etc/cron.d/ puede contener archivos de configuración múltiples, los cuales se consideran como complementarios a /etc/crontab. Si bien los paquetes especiales pueden agregar archivos (indicados en el nombre del paquete) a /etc/cron.d/, los administradores de sistemas deben usar /etc/crontab. Las configuraciones cron de nivel de usuario se almacenan en /var/spool/cron/crontabs/$USER. Sin embargo, éstas siempre deben configurarse usando la herramienta crontab. Con crontab, los usuarios pueden programar sus propias tareas recurrentes.

Programación de trabajos diarios, semanales y mensuales Los trabajos que deben ejecutarse en base a un cronograma diario, semanal o mensual simple – los cronogramas más usados – siguen una convención especial. Los directorios /etc/cron.daily/, /etc/cron.weekly/ y /etc/cron.monthly/ se crearon para contener conjuntos de scripts a ejecutarse diaria, semanal y mensualmente. Una forma sencilla de programar tareas de sistemas es agregar y eliminar scripts en estos directorios. Por ejemplo, para mantener un sistema que rota sus registros de forma diaria, uso el siguiente archivo de script: Listado 1. Archivo de script diario de muestra $ cat /etc/cron.daily/logrotate #!/bin/sh test -x /usr/sbin/logrotate || exit 0 /usr/sbin/logrotate /etc/logrotate.conf

Cron y anacron Puede usar anacron para ejecutar comandos periódicamente en base a una frecuencia especificada en días. A diferencia decron, anacron verifica si cada trabajo se ha ejecutado en los últimos n días (n es el período especificado para ese trabajo, en lugar de la coincidencia del tiempo actual con la ejecución programada). Si el trabajo no se ha ejecutado,anacron ejecuta su comando luego de transcurridos los minutos de espera especificados en el parámetro de retraso. Por consiguiente, en máquinas que no se ejecutan de forma continua, los trabajos periódicos se ejecutarán cuando la máquina esté en ejecución (obviamente, el tiempo exacto podría variar, pero la tarea no quedará sin realizarse). Anacron lee una lista de trabajos del archivo de configuración /etc/anacrontab. Cada entrada de trabajo especifica un período en días, un retraso en minutos, un identificador único de trabajo y un comando shell. Por ejemplo, en un sistema Linux que mantengo, uso anacron para ejecutar trabajos diarios, semanales y mensuales aun cuando la máquina no se esté ejecutando en el momento del día programado: Listado 2. Archivo de configuración anacron de muestra $ cat /etc/anacrontab # /etc/anacrontab: configuration file for anacron SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin # These replace cron's entries 1 5 cron.daily nice run-parts --report /etc/cron.daily 7 10 cron.weekly nice run-parts --report /etc/cron.weekly @monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly

Contenido de un crontab El formato de /etc/crontab (o el contenido de los archivos /etc/cron.d/) es levemente diferente al de los archivos crontab de usuario. Básicamente, se suma un campo adicional a /etc/crontab que indica el usuario con que se ejecuta un comando. Este campo no es necesario en los archivos

7

crontab de usuario porque estos ya se encuentran almacenados en un archivo que indica el nombre de usuario (/var/spool/cron/crontabs/$USER). Cada línea de /etc/crontab establece una variable de entorno o configura un trabajo recurrente. Las líneas de comentarios y en blanco se ignoran. En los trabajos cron, los primeros cinco campos especifican tiempos de ejecución (a cada campo basado en cero puede corresponder una lista y/o rango). Los campos son: minuto, hora, día del mes, mes, día de la semana (separados por espacios o tabulaciones). Un asterisco (*) en cualquier posición indica que se admite cualquier valor. Por ejemplo, para ejecutar una tarea a la medianoche los martes y jueves de agosto a octubre, podría usar: # line in /etc/crontab 0 0 * 7-9 2,5 root /usr/local/bin/the-task -opt1 -opt2

Uso de valores de programación especiales Algunos patrones de programación comunes poseen nombres de acceso directo para reemplazar los primeros cinco campos: @reboot Ejecutar una vez en el inicio. @yearly Ejecutar una vez por año, "0 0 1 1 *". @annually Igual a @yearly. @monthly Ejecutar una vez por mes, "0 0 1 * *". @weekly Ejecutar una vez por semana, "0 0 * * 0". @daily Ejecutar una vez al día, "0 0 * * *". @midnight Igual a @daily. @hourly Ejecutar una vez por hora, "0 * * * *". Por ejemplo, una configuración posible sería: @hourly root /usr/local/bin/hourly-task 0,29 * * * * root /usr/local/bin/twice-hourly-task

Uso de crontab Para configurar una tarea programada a nivel de usuario, use el comando crontab (en lugar del archivo /etc/crontab). Especificamente, crontab -e inicia un editor para modificar un archivo. Puede listar los trabajos actuales con crontab -l y eliminar el archivo con crontab -r. Otra posibilidad es

8

especificar crontab -u user para programar tareas para un usuario en particular, aunque la opción predeterminada exige que usted realice la programación de tareas (existen restricciones de permisos). Si en el sistema existe el archivo /etc/cron.allow, éste debe contener los nombres de todos los usuarios autorizados a programar trabajos. Si no existiese /etc/cron.allow, otra alternativa es no incluir a un usuario en el archivo /etc/cron.deny para que éste pueda programar tareas. Si no existiese ninguno de los dos archivos, todos los usuarios podrán usar crontab.

Automatización de tareas de una sola ejecución Uso del comando at Si desea programar una tarea para que se ejecute en el futuro, puede usar el comando at, el cual toma un comando de STDIN o de un archivo (usando la opción -f) y acepta descripciones de tiempo en un conjunto flexible de formatos. Se usa una familia de comandos asociada con el comando at: atq lista las tareas pendientes; atrm elimina la tarea de la cola de pendientes; y batch funciona de manera similar a at, con excepción de que espera que el sistema tenga poca carga para ejecutar el trabajo.

Permisos Al igual que /etc/cron.allow y /etc/cron.deny, el comando at cuenta con archivos /etc/at.allow y /etc/at.deny para la configuración de permisos. Si en el sistema existe el archivo /etc/at.allow, éste debe contener todos los usuarios autorizados a programar tareas. Si no existiese /etc/at.allow, otra alternativa es no incluir a un usuario en /etc/at.deny para que éste pueda programar tareas. Si no existiese ninguno de los dos archivos, todos los usuarios podrán usar at.

Especificaciones de tiempo Consulte las páginas man de su versión de at para obtener más información. Puede especificar un HH:MM en particular para que ocurra un evento la próxima vez que llegue esa hora. (si esa hora del día ya pasó, el evento ocurrirá al día siguiente a la hora especificada). Si prefiere usar el sistema de 12 horas, puede agregar a.m. o p.m. Puede proporcionar un fecha en los siguientes formatos: MMDDYY, MM/DD/YY, DD.MM.YY o mes-nombre-día. También puede contar a partir de la hora actual connow + N units, donde N es un número y units son minutes (minutes), hours (horas), days (días) o weeks (semanas). Las palabras today(hoy) y tomorrow(mañana) mantienen el significado obvio, al igual que midnight(medianoche) y noon(mediodía), mientras que teatime son las 4 p.m. A continuación se ofrecen algunos ejemplos: % at -f ./foo.sh 10am Jul 31 % echo 'bar -opt' | at 1:30 tomorrow La definición exacta de la especificación de tiempo se encuentra en /usr/share/doc/at/timespec.

Consejos relacionados con scripts Recursos externos Existen muchos libros excelentes sobre awk, Perl, bash y Python. El coautor de este tutorial recomienda el de su autoría (como no podría ser der otra manera), Text Processing in Python [Procesamiento de texto en Python] , como un buen punto de partida para aprender sobre scripting en Python. La mayoría de los scripts que escribimos para la administración de sistemas tienen como objetivo la manipulación de texto, por ejemplo, extraer valores de registros y archivos de configuración o generar informes y resúmenes. Otros objetivos son limpiar elementos innecesarios del sistema y enviar notificaciones de tareas realizadas. Los scripts más comunes para la administración de sistemas Linux se escriben en bash. Si bien bash cuenta con pocas capacidades incorporadas, éste permite utilizar herramientas externas (utilidades de archivos básicas como ls, find, rm y cd) y herramientas de texto (como la incluidas en las utilidades de texto GNU) con gran facilidad.

9

Consejos sobre Bash Una configuración especialmente útil a incluir en los scripts bash que se ejecutan en base a un cronograma es el switch set -x, el cual hace eco de la ejecución de los comando a STDERR. Esto resulta útil cuando los scripts de depuración de errores no producen el efecto deseado. Otra opción interesante para la prueba es set -n, la cual hace que el script busque problemas de sintaxis en lugar de ejecutarse. Por supuesto, la versión -n no deberá programarse en un cron o at, pero puede ayudar al poner el sistema en funcionamiento. Listado 3. Trabajo cron de muestra que ejecuta un script bash #!/bin/bash exec 2>/tmp/my_stderr set -x # functional commands here

Esto redirige STDERR a un archivo y envía la ejecución de comandos a STDERR. Más adelante, revisar este archive podría ser útil. La página man de bash es buena, aunque demasiado extensa. Resulta particularmente interesante conocer todas las opciones que acepta el set incorporado. Una tarea común que puede efectuar un script de administración de sistemas es el procesamiento de un conjunto de archivos donde los archivos de interés se identifican usando el comando find. No obstante, podría surgir un problema cuando los nombres de archivos contienen espacios en blanco o caracteres de nueva línea. Estos espacios en blanco internos podrían afectar los bucles y el procesamiento de nombres de archivo que usted pueda realizar. Por ejemplo, estos dos comandos son diferentes: % rm foo bar baz bam % rm 'foo bar' 'baz bam' El primero desvincula cuatro archivos (suponiendo que estos cuatro archivos existen en el sistema); el segundo elimina solamente dos archivos, cada uno de estos archivos incluye un espacio en el nombre. Los nombres de archivo con espacios son muy comunes en los contenidos multimedia. Afortunadamente, la versión GNU del comando find tiene una opción -print0 para terminar cada resultado en NULL; y el comando xargs cuenta con un comando -0 correspondiente que toma a los argumentos como separados por valores NULL. Combinando estos comandos, es posible limpiar archivos perdidos cuyos nombres podrían contener espacios en blanco de la siguiente manera: Listado 4. Limpieza de nombres de archivos con espacios #!/bin/bash # Cleanup some old files set -x find /home/dqm \( -name '*.core' -o -name '#*' \) -print0 \ | xargs -0 rm -f

Modo taint de Perl Perl ofrece un switch muy útil, -T, para activar el modo taint. En este modo, Perl toma una serie de precauciones de seguridad adicionales, de las cuales la más importante es que limita la ejecución de comandos que surjan de entradas externas. Si usa la ejecución sudo, el modo taint podría estar automáticamente activado. De todas formas, se recomienda iniciar los scripts de administración con: #!/usr/local/bin/perl -T A partir de este momento, todos los argumentos de la línea de comandos, variables de entorno, información local (ver perllocale), resultados de ciertas llamadas de sistemas (readdir(), readlink(), la variable de shmread(), los mensajes devueltos por msgrcv(), la contraseña, gcosy campos shell devueltos por llamadas getpwxxx()) y todas las entradas de archivos aparecerán marcadas como "corrompidos". Los datos corrompidos no podrán usarse directa o indirectamente en ningún

10

comando que invoque un subshell ni en un comando que modifique archivos, directorios o procesos, salvo algunas pocas excepciones. Es posible descorromper valores externos específicos buscando cuidadosamente patrones esperados: Listado 5. Descorrupción de valores externos if ($data =~ /^([-\@\w.]+)$/) { $data = $1; # $data now untainted } else { die "Bad data in $data"; # log this somewhere }

Paquetes Perl CPAN Una de las ventajas de Perl es que ofrece un útil mecanismo de instalación de paquetes de soporte adicional denominado Comprehensive Perl Archive Network (CPAN). RubyGems cumple con una función similar a la realizada por este mecanismo. Lamentablemente, Python aún no cuenta con un mecanismo de instalación automatizada, pero su instalación predeterminada es más completa. Los lenguajes más sencillos como bash y awk no poseen componentes adicionales equivalentes. La página man sobre el comando cpan es un buen comienzo, especialmente si piensa que la tarea que necesita ya ha sido creada por otros. Consulte los módulos candidatos en CPAN. cpan viene tanto en formato de shell interactivo como de operación en la línea de comandos. Una vez configurado (ejecute el shell interactivo una vez para que se le solicite ingresar opciones de configuración), cpan administra las dependencias y ubicaciones de descargas de forma automatizada. Por ejemplo, supongamos que se le presenta una tarea de administración de sistemas que requiere el procesamiento de archivos de configuración en formato YAML (yaml Ain't Markup Language). Instalar el soporte de YAML será así de sencillo: % cpan -i YAML # maybe with 'sudo' first Luego de la instalación, en la parte superior de sus scripts podrá aparecer use YAML; en casos de capacidades para la cuales exista un paquete disponible. Recursos Aprender • "Understanding Linux configuration files" [Conozca los archivos de configuración de Linux] (developerWorks, diciembre de 2001) le enseña a configurar archivos de configuración en un sistema Linux que controle permisos de usuarios, aplicaciones de sistemas, daemons, servicios y otras tareas administrativas dentro de un entorno multiusuario y multitarea. •

El tutorial developerWorks "Using the GNU text utilities" [Uso de utilidades de texto GNU] (developerWorks, marzo de 2004) es una introducción a las utilidades de scripting.



Estos artículos sobre scripting en developerWorks le proporcionan una gran variedad de recursos sobre el uso de scripts para automatizar tareas en Linux.



Text Processing in Python [Procesamiento de texto en Python] de David Mertz, coautor de este tutorial, es una excelente fuente de scripts Python.



Encuentre más recursos para desarrolladores Linux en la zona Linux en developerWorks.



Construya su próximo proyecto de desarrollo en Linux con el software de prueba de IBM, disponible para su descarga directa desde developerWorks.

11

Autor:

David Mertz es Turing completo, pero probablemente no apruebe la Prueba de Turing. Para conocer más acerca de su vida, consulte su página Web personal. David escribe las columnas developerWorks Charming Python y XML Matters desde el año 2000. Consulte su libroText Processing in Python [Procesamiento de texto en Python].

Compilación y edición: Ing. Sergio Aguilera. Facultad de Tecnología Informática. Universidad de Belgrano. [email protected] Todos los Derechos Reservados a IBM Corp. – Marzo 2012.

12