Página principal

Introduccion. 1 Antecedentes históricos


Descargar 277.59 Kb.
Página4/4
Fecha de conversión18.07.2016
Tamaño277.59 Kb.
1   2   3   4

-Comando at

Ejecuta , a la hora determinada , el . Puede ser una shell-script , ó un ejecutable.

Este comando admite la entrada desde un fichero ó bien desde el teclado. Normalmente , le daremos la entrada usando el "here document" de la shell.

El "cuando" admite formas complejas de tiempo. En vez de contar todas , veamos algunos ejemplos que seguro que alguno nos cuadrará :

* Ejecutar la shell "salu2.sh" que felicita a todos los usuarios , pasado mañana a las 4 de la tarde:

# at 4pm + 2 days <

/usr/yo/salu2.sh

EOF

* Lanzar ahora mismo un listado:



at now + 1 minute <

"lp -dlaserjet /tmp/balance.txt"

EOF

* Ejecutar una cadena de reindexado de ficheros larguísima y apagar la máquina:



at now + 3 hours <

"/usr/cadenas/reind.sh 1>/trazas 2>&1 ; shutdown -h now"

EOF

* A las 10 de la mañana del 28 de Diciembre mandar un saludo a todos los usuarios :



at 10am Dec 28 <

wall "Detectado un virus en este ordenador"

EOF

* A la una de la tarde mañana hacer una salvita :



at 1pm tomorrow <

/home/Salvas/diario.sh

EOF

De la misma manera que el comando nohup , éstos comandos de ejecución en diferido mandan su salida al mail , por lo que hay que ser cuidadoso y redirigir su salida a ficheros personales de traza en evitación de satu rar el directorio /var/mail.



El comando "at" asigna un nombre a cada trabajo encolado , el cual lo podemos usar con opciones para consultar y borrar trabajos :

at -l : lista todos los trabajos en cola , hora y día de lanzamiento de los mismos y usuario.

at -d : borra de la cola.

Ya que el uso indiscriminado de éste comando es potencialmente peligroso , existen dos ficheros que son inspeccionados por el mismo para limitarlo : at.allow y at.deny. (Normalmente residen en /usr/spool/atjobs ó en /var/a t).

at.allow:si existe, solo los usuarios que esten aquí pueden ejecutar el comando "at".

at.deny:si existe, los usuarios que estén aquí no estan autorizados a ejecutar "at".

El "truco" que hay si se desea que todos puedan usar at sin tener que escribirlos en el fichero , es borrar at.allow y dejar sólo at.deny pero vacío.

- Batch .

Ejecuta el comando como en "at" , pero no se le asigna hora ; batch lo ejecutará cuando detecte que el sistema se halla lo suficientemente libre de tareas. En caso que no sea así , se esperará hasta que oc urra tal cosa.

-Cron.


No es un comando ; es un "demonio" , ó proceso que se arranca al encender la máquina y está permanentemente activo. Su misión es inspeccionar cada minuto los ficheros crontabs de los usuarios y ejec utar los comandos que allí se digan a los intervalos horarios que hayamos marcado. Como se acaba se señalar , los crontabs son dependientes de cada usuario.

Se deben seguir los siguientes pasos para modificar , añadir ó borrar un fichero crontab :

1 - Sacarlo a fichero usando el comando "crontab -l >/tmp/mio" , por ejemplo.

2 - Modificarlo con un editor de acuerdo a las instrucciones de formato que se explican a continuación.

3 - Registrar el nuevo fichero mediante el comando "crontab /tmp/mio" , por ejemplo.

mira cada minuto el directorio /var/spool/crontabs y ejecuta los comandos

crontab .

El formato del fichero es el siguiente :

#minutos horas dia mes mes dia-semana comando ( # = comentario )

minutos : de 0 a 59.

horas : de 0 a 23.

dia del mes : de 0 a 31.

mes : de 0 a 12.

día semana : de 0 a 6 ( 0 = domingo , 1 = lunes ...)

Aparte de la especificación normal , pueden utilizarse listas , es decir , rangos de valores de acuerdo con las siguientes reglas :

8-11 : Rango desde las 8 hasta las 11 ambas inclusive.

8,9,10,11 : Igual que antes ; desde las 8 hasta las 11.

Si queremos incrementar en saltos diferentes de la unidad , podemos escribir la barra "/" :

0-8/2 : Desde las 12 hasta las 8 cada 2 horas. Equivale a 0,2,4,6,8 .

El asterisco significa "todas" ó "todo". Por tanto :

*/2 : Cada dos horas.

Ejemplos más evidentes :

# ejecutar una salvita todos los dias 5 minutos despues de las 12 de la noche :

5 0 * * * /home/salvas/diaria.sh 1>>/home/salvas/log 2>&1

# ejecutar a las 2:15pm el primer dia de cada mes:

15 14 1 * * /home/salvas/mensual.sh 1>/dev/null 2>&1

# ejecutar de lunes a viernes a las diez de la noche - apagar la maquina que es muy tarde

0 22 * * 1-5 shutdown -h now 1>/dev/null 2>&1

# ejecutar algo cada minuto

* * * * * /home/cosas/espia.sh

4 TRATAMIENTO DE FICHEROS.

Comando :wc

Misión: cuenta lineas,palabras o caracteres de un fichero.

opciones:

-l:lineas

-c:letras

-w:palabras

Ejemplo:


l=`wc -l /etc/passwd` ; echo "Hay $l usuarios registrados en este equipo"

En la variable $l tendríamos el número de líneas del fichero /etc/passwd.

Comando: tr 'caracteres orig' 'caracteres destino' < nombre-archivo

Misión: sustituye globalmente un caracter por otro .

Ejemplo:

tr '[a-z]' '[A-Z]' < /etc/passwd >/tmp/passwd.MAYUSCULAS

Pasa el fichero de entrada a mayúsculas.

Comando: cut

Misión: corta texto a través del número absoluto de columna o el número relativo de

campo.


Opciones:

-c:numero absoluto de columna

-f:numero de campo.

-d:delimitador de campo.

Especificación de números de columna.

1,3,10 : primera , tercera y decima columnas.

1-3 : de la primera a la tercera columna.

1-3,8 : de la primera a la tercera y la octava.

-5 : de la primera a la quinta columna

5- : de la quinta a la última.

Ejemplo :

cut -d"." -f1 /etc/passwd

lista sólamente los nombres del fichero /etc/passwd , cortando por el delimitador ‘:’ .

Comando: paste.

Misión:

Comando : split <-numero de lineas de los ficheros>

Misión: divide en n ficheros de cada uno. Si no se indica el

numero de lineas , se consideran 1000.

los ficheros que genera se llaman xaa , xab , xac ...

Ejemplo:


$ split gordo

$ ls


gordo xaa xab xac xad xae xaf xag

Ha partido el fichero "gordo" en ficheros más pequeños , de 1000 líneas cada uno , denominados "xaa" ,"xab" ..... Si borramos el fichero "gordo" , podríamos volver a ge nerarlo con el comando siguiente:

$ cat xaa xab xac xae xaf xag > gordo

Comando: sort

Misión: ordena un fichero de acuerdo a una secuencia de odenacion determinada.

Ejemplo


dado un fichero con:

codigo nombre ciudad telefono

$ sort fichero # ordena por todos los campos

$ sort +1 fichero # ordena a partir del campo 1 (nombre ; codigo es el 0)

$ sort +2n fichero # ordena por nombre , en secuencia invertida.

$ sort +2n -t":" fichero # igual que antes , pero suponiendo que el separador es ":".

Comando: grep

Misión: buscar apariciones de palabras ó textos en ficheros.

Ejemplo:

$ grep root /etc/passwd # busca las líneas que contienen "root" en el fichero.

root:Ajiou42s:0:1:/:/bin/sh

Otro:


$ ps -e | grep -v constty # busca qué procesos no ruedan en la consola

( ...... )

La familia de grep , así como otros comandos tales como de (editor de líneas), sed (editor batch) y vi , manejan expresiones regulares para la búsqueda de secuencias de caracteres. Una expresión regular es un a expresión que especifica una secuencia de caracteres. Un ejemplo de ésto es el comando : ls -l | grep "^d" ; el "^d" es una expresión regular que equivale a decir "si la letra -d- está al principio de la línea" ; la construcción anterior nos lista sólo los directorios.

Las expresiones regulares conviene esconderlas de la shell encerrándolas entre comillas.

Algunos montajes de expresiones regulares son :

<.> (Punto) :cualquier carácter distinto al del fin de línea.

[abc] :la letra a , la b ó la c.

[^abc] :cualquier letra distinta a a , b ó c.

[a-z] :cualquier letra de la -a- a la -z- .

Una letra seguida de un asterisco -*- equivale a cero ó más apariciones de la letra. Por tanto , la expresión .* equivale a decir "cualquier cosa". Por tanto, el comando :

ls -l | grep ‘\.sh.*"

lista todos los ficheros que terminen en .sh mas los terminados en .sh . Nótese que el punto inicial lo hemos desprovisto de su significado "escapándolo" con un backslash -\- .

^ : al principio de una expresión regular equivale a "desde el principio de la línea".

$ : al final de una expresión regular equivale a "hasta el final de la línea".

Ejemplos de ésto :

ls -l | grep ‘\.sh$’ : saca los ficheros que SOLO acaben en .sh

Este tema se complica todo lo que se quiera . Veamos algunas expresiones regulares bastante usadas en comandos tipo sed ( que veremos más tarde ) para percatarse de ello :

[^ ] : cualquier letra diferente de espacio.

[^ ]* : una palabra cualquiera (varias letras no blancas).

[^ ]* * : una palabra seguida de un número incierto de blancos.

^[^ ]* * : la primera palabra de la línea y a todos los blancos que la siguen.

Comando: diff

Misión: Encuentra las diferencias entre dos ficheros.

Ejemplo:

$ cat nombres1

jose

juan


roberto

$ cat nombres2

jose

roberto


$ diff nombres1 nombres2

2d1


< juan

Comando: join

Misión: mezcla ficheros clasificados

$ cat uno

antonio alperchines,5

juan seneca,32

maria oxigeno,45

pablo isaac peral,54

$ cat dos

antonio madrid

juan segovia

maria avila

pablo guadalajara

$ join uno dos

antonio alperchines,5 madrid

juan seneca,32 segovia

maria oxigeno,45 avila

pablo isaac peral,54 guadalajara

Comando: fold <-ancho-en-columnas>

Misión: pasar palabras automáticamente a la línea siguiente. En el caso de tener un texto con líneas de más de 80 caracteres , al imprimirlo queda truncado. Usando éste comando , cualquie r texto que sobrepase el ancho establecido se pasa a la línea inferior.

Ejemplo:

fold -80 carta.txt | lp

Comando: sed ‘comandos de sed’

Misión efectúa cambios en ‘fichero’ , enviando el resultado por la salida estándar. Pueden guardarse los resultados de éstas operaciones en un fichero como siempre , redireccionando la salida , tal que - sed ‘expresion’ fichero >/tmp/salida -.

Utilizaremos sed normalmente cuando sea necesario hacer cambios en ficheros de texto ; por ejemplo , nos puede valer para cambiar determinada variable en una serie de ficheros de profile de usuario , etc.

La explicación completa de éste comando exigiría mucho detalle ; veamos sólamente algunos ejemplos de operaciones con sed :

* Cambiar , en el fichero /home/pepito/.profile , la expresión TERM=vt100 por TERM=vt220 . Usamos el comando ‘s/expresion_a_buscar/expresion_a_cambiar/g’ (s=search,g=global) :

sed ‘s/TERM=vt100/TERM=vt220/g’ /home/pepito/.profile >/tmp/j && mv /tmp/j /home/pepito/.profile

(si el comando ha sido OK , entonces movemos el /tmp/j).

* Meter tres blancos delante de todas las líneas del fichero /tmp/script.sh :

sed ‘s/^/ /’ /tmp/script.sh >/tmp/j && mv /tmp/j /tmp/script.sh

(el ^ identifica el principio de cada línea).

* (mas raro): Cepillarse todos los ficheros de un directorio :

ls | sed ‘s/^/rm -f /’ | sh

(del ls sale el fichero ; el sed le pone delante "rm -f" y el sh lo ejecuta.

APENDICE A: Ejemplos de shell-script multipropósito.

# programa para contar

# llamada : contar.sh

case $# in

0) echo "Falta argumento"

exit 1

;;

esac



c=0

while [ $c -le $1 ]

do

echo $c


c=`expr $c "+" 1`

done


# programa para listar sólo subdirectorios

# llamar como "dir.sh"

ls -l $* | grep ‘^d’

# programa para ver quien esta conectado

# llamar como "ju ..."

for j in $*

do

donde=`who | grep $j | sed ‘s/^[^ ]* *\([^ ]*\).*/\1/p’`



if [ "$donde" ]

then


echo "$j conectado en $donde"

else


echo "$j no esta conectado"

fi

done



# programa para paginar un fichero con mensajito al final de cada pantalla

# llamar como "mas "

pg -p ‘Pagina %d : ‘ -n $*

# programa para seleccionar interactivamente ficheros

# se usa dentro de una pipe como : cat `pick *` |

for j # no tiene error! esta cosa rara permite coger todos los ficheros del argumento

do

echo "$j ? \c" >/dev/tty



read resp

case $resp in

s*) echo $j ;; # si escribe "s" ó "si"

n*) break ;; # lo mismo

esac

done

# programa para borrar de un directorio los ficheros mas viejos de 7 días

# llamar como "limpia.sh "

case $# in

0) echo "Falta argumentos"

exit 1

;;

esac



cd $1 && { find . -type f -mtime +7 -exec rm -f -- {} \; ; }

# programa para si los ficheros de un directorio ocupan mas de 5 Mb se truncan.

# llamar como "trunca.sh "

case $# in

0) echo "Falta argumento"

exit 1


;;

esac


cd $1 || echo "No puedo cambiar a $1 - saliendo" ; exit 1

for j in *

do

if [ ! -f $j ]



then

continue


fi

siz=`ls -ld $j | awk ‘{ print $5 }’

if [ $siz -gt 5000000 ]

then


echo "Truncando $j"

>$j


fi

done


# programa que saca el date en formato dia/mes/año hora:minuto:segundo

# llamar como "fecha.sh"

d=`date ‘+%d/%m/%y %H:%M:%S’`

echo "FECHA Y HORA : $d"

# programa para detectar si alguien inicia sesión

# llamar como "watchfor "

# Extraído del "Unix Programming Environment" de Kernighan & Pike

case $# in

0) echo "Sintaxis : watchfor usuario" ;

exit 1 ;;

esac

until who | grep "$1"



do

sleep 60


done

APENDICE B : Optimización y mantenimiento del sistema.

Si bien las tareas específicas de optimización y mantenimiento suelen estar muy "pegadas" a la versión y al dialecto del UNIX , se exponen a continuación unas directrices básicas a modo de or ientación ; para desgracia del lector , cualquier detalle adicional habrá de buscarlo en el denostado "System Administrator Guide" de su equipo. Todo lo antedicho puede resumirse en el siguiente aserto : "estos son unos cuanto s consejos caseros".

Lo que aquí se detalla se basa fundamentalmente en System V , algo de BSD 4.4 y en el Fast File System con las mejoras de Berkeley.

Para poder optimizar un sistema operativo ó un conjunto de aplicaciones rodando en él , es necesario conocer con exactitud qué recursos están siendo consumidos , las limitaciones de los mismos y la mejor mane ra de asignarlos a los usuarios y a las aplicaciones . Excesivas demandas , ó nuevas demandas a un sistema ya muy sobrecargado puede afectar significativamente al rendimiento.

En la mayoría de los casos , la solución a éstas sobrecargas pasa por alguno de éstos puntos :

- Modificar algún parámetro del núcleo (kernel). En algunos casos , existen límites impuestos por el sistema que pueden ser aumentados ( número de ficheros abiertos , número de semáforos ....) y en otros corresponden a tamaños de búferes , tablas del sistema , etc .

- Redistribuir los datos en los discos.

- Eliminar la fragmentación reconstruyendo los sistemas de ficheros.

- Rediseñar aplicaciones que distribuyan los recursos de la manera más optimizada posible.

De cualquier manera , puede ser necesario añadir más potencia de CPU , más memoria ó más discos. Antes de acometer cualquiera de éstas tareas , conviene repasar distintos puntos en busca siempre de conseguir que el equipo ruede de la manera más descargada posible.

* Ficheros de log y similares.

Muchos de los programas dentro de un sistema UNIX guardan información en ficheros de log . Es necesario por tanto hacer limpieza y reducciones periódicamente , puesto que un fichero , cuanto más grande sea , m&aacut e;s trabajo cuesta escribir en él.

Examinar antes de nada el fichero "/etc/syslog.conf" , que contiene los nombres de aquellos ficheros que intervienen.

Vigilar especialmente los siguientes ficheros y directorios :

/var/adm/log/..... Ficheros diversos de log del sistema (kernel , tcp/ip ... )

/var/adm/sulog Cada vez que se ejecuta el comando ‘su’ , añade un registro aquí.

/var/adm/messages Recoge los mensajes de error del syslogd (demonio de log).

/etc/log/.... Logs de arranque.

/etc/wtmp,

/etc/wtmpx Cada usuario que entra al sistema crea un registro.

/var/cron/log Arranques del cron.

/usr/preserve Restos de ficheros editados con el editor ‘vi’

/usr/mail Ficheros de correo de todos los usuarios.

Consultar el "System Administration Guide" para detalles específicos.

* Shell-scripts.

-En muchos casos , el acceso al sistema implica ejecutar una aplicación. Si se arranca la shell de usuario y después la aplicación , tendremos DOS procesos iniciales por cada usuario. Podemos ver que ésto es así usando el comando "whodo". Si éste es el caso , deberemos modificar el .profile del usuario de manera que éste ejecute la aplicación con el comando ‘exec ‘ , de tal manera que el proceso de aplicación reemplaza el proceso de la shell.

-Las "shell-scripts" son muy fáciles de usar y crear , pero gastan más recursos que un programa compilado. Si su uso es intensivo en las aplicaciones , es conveniente estudiar cuales se pueden pasar a ejecutables C.

-La variable "PATH" , usada para localizar ejecutables y shells , debe contener sólo aquellas entradas que realmente sean necesarias y los directorios más usados han de ser los que aparezcan primero.

 

* Procesos / Sistemas de ficheros / discos duros.



- En ningún caso permitir que un sistema de ficheros llegue a ocupar más del 90 %.

- Repartir aquellos directorios muy grandes en varios más pequeños ; a ser posible , evitar aquellos directorios con más de 320 entradas ; podemos buscarlos con el siguiente comando:

find / -type d -size +10 -print

- Buscar procesos que "coman" mucho tiempo de procesador ; pueden ser programas buclados ó simplemente programas que ejecutan intensivamente procesos algebraicos en coma flotante ó con mucha recursividad ; el pro grama benchmark de Dhrystones por si solo ocupa en una máquina corriente UNIX el 95 % de CPU.

Podemos averiguar qué procesos gastan más mediante la siguiente operación :

ps -ef >/tmp/ps.1;sleep 20;ps -ef >/tmp/ps.2;diff /tmp/ps.1 /tmp/ps.2

( El comando "diff" saca aquellos procesos que han consumido tiempo de CPU ).

- Lanzar procesos relacionados con cintas fuera de horas de trabajo (Son pesadísimos para el sistema).

- Aquellos sistemas de ficheros susceptibles de fragmentarse en exceso ( uso pesado haciendo borrados , adiciones y modificaciones de registros ) , se pueden desfragmentar copiándolos a cinta , borrando todo el sistema de fichero s y volviéndolos a recuperar , tarea ésta que conviene aplicar periódicamente.

- Si bien UNIX da siempre mayor prioridad a los procesos "on-line" , aquellas cadenas batch que sean gravosas para el sistema (listados gordos , procesos de reconstrucción ... ) deberán ser ejecutadas con menor p rioridad , usando a tal efecto el comando "nice" ó "renice" para porcesos ya en curso.

- A medida que aumentamos discos duros , conviene aumentar también de controladoras . Mientras que un disco puede procesar de 25 a 35 operaciones de E/S por segundo , una controladora normal procesa unas 65 ; si bien una placa de éstas aguanta hasta 7 discos , es conveniente no pasarse.

- Colocar los sistemas de ficheros más usados sobre los discos más rapidos , en concreto el /tmp y el /var, así como las áreas de swap;conviene que estén repartidas sobre varios discos.



- Colocar la informacion mass utilizada en zonas adyacentes.

CONCLUSION. Optimizar un sistema UNIX no es ni fácil ni evidente ; normalmente , suele bastar con mantenerlo saneado a base de operaciones periódicas tales como: - Apagar el equipo al menos semanalmente. - Mantener los directorios /tmp y /var/tmp descargados. - Borrar y truncar aquellos ficheros de log que crecen (ver sección anterior) , bien al arrancar el equipo ó bien "sobre la marcha" , poniendo una entrada en el cron. - Buscar y eliminar ficheros supérfluos ó innecesarios , sacando a cinta aquellos que no vamos a utilizar a menudo.
1   2   3   4


La base de datos está protegida por derechos de autor ©espanito.com 2016
enviar mensaje