domingo, 26 de noviembre de 2017

TAREAS PROGRAMADAS

Linux tiene un dominio cron que normalmente se ejecuta en el arranque de linux. Este dominio despierta cada minuto, mira si tiene que ejecutar alguna tarea, la ejecuta y se duerme. Si queremos que algún comando o tarea se ejecute automáticamente cada cierto tiempo, la forma de hacerlo es indicándole a este dominio que lo haga.
Hay varios ficheros en el sistema operativo y para cada usuario en el que este dominio busca tareas para ejecutar. Uno de ellos es /etc/crontab. El formato de este fichero es:
minuto hora dia_del_mes mes dia_de_la_semana usuario comando

Donde minuto, hora, dia_del_mes, mes y dia_de_la_semana son lo que parecen, a qué hora, minuto, etc. Se debe ejecutar el comando. En estos campos se pueden poner comodines y hay varios formatos. Por ejemplo, un * en minuto es en todos los minutos:
  • * 4 * * *    significa todos los minutos de las cuatro de la madrugada, todos los días, todos los meses. Es decir, se ejecuta 60 veces a las 4:00 am, 4:01 am,... 4:59 am y ya no más hasta el día siguiente.


También se pueden poner rangos o valores discretos, así:
  • 10,20,30 * * * * significa todos los días a todas las horas en los minutos 10, 20 y 30, es decir, a las 0:10 am, 0:20 am, 0:30 am, 1:10 am, 1:20 am, etc.
  • */15 10-14 * * * significa cada 15 minutos entre las 10 am y las 2 pm (las 14).


Y así un largo etcétera.
Un ejemplo concreto de lo que puede haber en un crontab:
  • 0 0 * * 6 root rm -rf /home/usuario/temp


Borraría todos los sábados (día 6) a las 0:00 horas el directorio /home/usuario/tmp.
Un usuario puede crear sus propias tareas y añadirlas a cron. Para ello, en cualquier ubicación crea un fichero similar a crontab con el nombre que quiera y sin poner el usuario. Por ejemplo:
  • 0 11 * * 1-5 avisameParaElCafe.sh


Ejecutaría todos los días de lunes a viernes (1-5) a las 11:00 am el comando "avisameParaElCafe.h". Si este fichero se llama mi_cron, entonces para añadir estas tareas al demonio de cron hay que ejecutar el comando:
  • crontab mi_cron


SEÑALES ENTRE PROCESOS

Los procesos en el sistema operativo están unívocamente identificados mediante un PID, o Process Identifier. El PID es un número entero que identifica a cada uno de los procesos del sistema, de una manera a la que Linux nos tiene acostumbrados, puesto que casi todos los elementos del sistema se identifican numéricamente (procesos, archivos, directorios, dispositivos, etc.).

Los tipos de señales son:

  •   SIGHUP: El modem ha detectado línea telefónica colgada
  •   SIGINT: Interrupción de teclado, la tecla DEL ha sido pulsada
  •   SIGQUIT: Señal Quit (desde el teclado CTRL \)
  •  SIGILL: Instrucción ilegal
  •   SIGTRAP: Traza de los traps (excepciones)
  •   SIGABRT: Abortar un programa
  •   SIGBUS: Error en el Bus
  •   SIGFPE: Excepción por rebosamiento de coma flotante
  •   SIGKILL: Matar un proceso
  •  SIGUSR1: El usuario define la señal # 1
  •  SIGSEGV: Violación de segmentación
  •  SIGUSR2: El usuario define la señal # 2
  •  SIGPIPE: Escritura en pipe sin lectores
  •  SIGALRM: Alarma
  •  SIGTERM: Software genera una señal de terminación
  •  SIGSTKFLT: Fallo en el stack
  •  SIGCHLD: Cambia el estado del hijo, terminado o bloqueado
  •  SIGCONT: Si está bloqueado continuarGSTOP: Señal de paro
  •  SIGTSTP: Paro del teclado
  •  SIGTTIN: Proceso en segundo plano quiere leer, lectura terminal
  • SIGTTOU: Proceso en segundo plano quiere escribir, escritura terminal
  • SIGURG: Condición urgente
  • SIGXCPU: Excedido el límite de la CPU
  • SIGXFSZ: Excedido el límite del tamaño de un fichero
  • SIGVTALRM: Alarma del reloj virtual
  • SIGPROF: Historial del reloj
  • SIGWINCH: Cambia el tamaño de la ventana
  • SIGIO: Ahora es posible la entrada salida
  • SIGPWR: Fallo en la alimentación
  • SIGSYS: Llamada al sistema errónea
  • SIGRTMIN: Primera señal en tiempo real



PROCESOS DE LINUX

Tipos de procesos en Linux: Child, daemon, orphan y zombie.

Los procesos son algo fundamental en un sistema operativo. Casi todas las actividades de un sistema hacen uso de procesos para llevar a cabo sus tareas. De hecho, gracias a los procesos el sistema operativo está "operativo", es decir, funcionando correctamente y por un gran puñado de ellos el mismo nos tiene disponible de forma instantánea los recursos físicos (hardware) de nuestra computadora.

Es muy probable que al utilizar el comando top para visualizar los procesos activos del sistema te hayas fijado que en la parte superior hay una línea que dice cuántos procesos en total hay en ejecución, cuántos están dormidos (sleeping), detenidos (stopped) y zombie. Estas denominaciones hacen referencia a los estados de dichos procesos en un momento determinado. A continuación, describiremos los diferentes procesos por su tipo o estado.

Child (hijos)

Son procesos creados por otro proceso durante su ejecución. Usualmente los procesos child son creados para ejecutar un binario desde un proceso existente, con la llamada del sistema fork (). Los procesos normalmente son creados para ejecutarse a través de un shell o terminal. En dicho caso el shell se convierte en proceso padre y el proceso ejecutado se convierte en hijo. En sistemas tipo Unix/Linux cada proceso tiene un padre excepto el proceso init.

Daemon (demonios)

Son tipos especiales de procesos que se ejecutan en segundo plano y están relacionados con el sistema operativo y no tienen shell asociado. Estos corren con permisos de root y usualmente proveen servicios. El no tener shell asociado se logra separando el proceso del shell, creando un proceso nuevo y terminando el proceso padre (el shell que lo inició). Desde el momento en que su proceso padre es terminado el proceso de hace independiente (ya no es más un proceso child) y es tomado por el proceso init el cual lo convierte en un daemon.

Orphan (huérfanos)

Usualmente un proceso crea un proceso hijo (child) y cuando el proceso hijo termina una señal es emitida al proceso padre para que pueda hacer todo lo requerido cuando el proceso hijo es terminado. Pero hay situaciones en las que los procesos padres son matados (killed). En dicho caso el proceso hijo queda huérfano y entonces es tomado por el proceso init. Aun así, el proceso cuyo padre fue matado sigue siendo llamado huérfano ya que su padre original no existe.

Zombie

Cuando un proceso child o hijo es terminado o es completada su ejecución, luego su entrada en la tabla de procesos se mantiene hasta que el proceso padre obtenga la información del estado del proceso hijo terminado. Hasta entonces el proceso terminado entra en estado zombie y es conocido como proceso zombie. Cuando un proceso es terminado toda la memoria y recursos asociados con dicho proceso son liberados pero la entrada del mismo en la tabla de procesos aún existe. Una seña SIGCHILD es enviada al proceso padre (ha sido terminado). Comúnmente el manejador de esta señal en el proceso padre ejecuta una llamada de espera que obtiene el estado de salida del proceso terminado y entonces la entrada del proceso zombie es borrada de la tabla de procesos.

GESTIÓN DE VENTANAS

Un gestor de ventanas o manejador de ventanas es un programa informático que controla la ubicación y apariencia de las ventanas bajo un sistema de ventanas en una interfaz gráfica de usuario. Las acciones asociadas al gestor de ventanas suelen ser, abrir, cerrar, minimizar, maximizar, mover, escalar y mantener un listado de las ventanas abiertas.


Es también muy común que el gestor de ventanas integre elementos como: el decorador de ventanas, un panel, un visor de escritorios virtuales, iconos y un tapiz.Las plataformas Windows, Haiku os(software libre MIT) y Mac OS X ofrecen un gestor de ventanas estandarizado por sus vendedores y/o desarrolladores e integrado en el propio sistema operativo. En cambio el sistema gráfico X Window, popular en el ámbito de sistemas Unix y similares, como GNU/Linux, permite al usuario escoger entre varios gestores. Los gestores de ventanas difieren entre sí de muchas maneras, incluyendo apariencia, consumo de memoria, opciones de personalización, escritorios múltiples o virtuales y similitud con ciertos entornos de escritorio ya existentes, entre otras.


ENTORNO GRÁFICO XWINDOWS / X11

El X Window System o sistema X Window (Window, no Windows), normalmente llamado las X, es elentorno gráfico de los sistemas UNIX. Creado en el MIT en 1984, posteriormente se han encargado de su desarrollo y mantenimiento diversos consorcios de fabricantes (X Consortium, Open Group, X.org Foundation). Actualmente se encuentra en su versión 11.6, por lo que se suele denominar X11 o X11R6.
FreeDesktop (freedesktop.org) promueve estándares de escritorio para que aplicaciones de distinta procedencia interactúen correctamente entre sí.
El sistema X Window se encarga de mostrar la información gráfica, está construido con arquitectura cliente-servidor y es una capa totalmente independiente del Sistema Operativo. Cuando instalemos en una máquina el sistema X Window se instalarán tres componentes:

  1. el servidor X: es el servidor gráfico.
  2. el display manager: se encarga del login gráfico.
  3. el cliente X (o window manager): es el cliente gráfico.



CONFIGURACIÓN DEL ENTORNO (VARIABLES)

Hay varios métodos para añadir variables de entorno en linux. Normalmente existen diferentes scripts que se ejecutan en diferentes eventos, por ejemplo, cuando un usuario se loguea en el sistema se ejecuta un archivo llamado .bashrc. Este es un archivo de sistema que se encuentra en la carpeta del usuario /home/usuario/.bashrc
Este script es un buen lugar para añadir la variable de entorno. Aunque también existen otros siios.

En este ejemplo veremos cómo añadir una ruta a la variable de entorno PATH, que es una variable común para asignar rutas de aplicaciones y comandos que se instalan en el sistema.

Podemos usar cualquier editor para modificar los datos, por ejemplo:

  • vim /home/nombreusuario/.bashrc


Para evitar sobreescribir esta variable (es posible que se haya definido en otro sitio), podemos hacerlo de añadiendo esta línea al final del archivo:

  • export PATH=$PATH:/directorio1:/directorio2:...:/directorioN


Para que los cambios surtan efecto podemos reiniciar sesión con ese usuario al que le hemos editado el archivo o bien podemos usar el comando de linux source:

  • source /home/nombreusuario/.bashrc


Para probar que se ha guardado correctamente podemos escribir:


  • $PATH

PRINCIPALES ORDENES DE LINUX

El conocimiento de los comandos Linux es importante para las tareas de administración y programación. Los comandos Linux son necesarios para tener un dominio del sistema operativo. La línea de comandos es la manera más directa de enviar órdenes a su máquina. La línea de comandos de GNU/Linux es más potente que los prompts que puede haber usado con anterioridad.


  • Comandos Linux de archivos y directorios
  • Comandos Linux de ficheros y directorios, crear y borrar directorios; listar, copiar, renombrar y borrar archivos, crear enlace entre archivos


INTERPRETE DE COMANDOS DE LINUX (SHELL).

El intérprete de comandos actúa como una interfaz alfanumérica y a su vez es un programa informático, hace posible que el sistema operativo realice órdenes deseadas por el usuario mediante una serie de comandos. Su uso nos da una gran flexibilidad sobre el sistema, fundamental para todo aquel que quiera conocer mejor la esencia de los sistemas Linux o quiera profundizar en el área de administración de sistemas, programación, redes y servidores. También llamada interprete de línea de comandos (CLI).

 Los comandos tienen la siguiente sintaxis:

  •                   # programa arg1 arg2 ... argn



Se observa que, en la "línea de comando'', se introduce el programa seguido de uno o varios argumentos. Así, el intérprete ejecutará el programa con las opciones que se hayan escrito.

Cuando se quiere que el comando sea de varias líneas, se separa cada línea con el carácter barra invertida (_). Además, cuando se quiere ejecutar varios comandos en la misma línea, los separa con punto y coma (;). Por ejemplo:

  •                  # make modules ; make modules_install



En los comandos, también se puede utilizar los comodines:

El asterisco (*) es equivalente a uno o más caracteres en el nombre de un archivo.
  • Ejemplo: ls *.c lista todos los archivos con extensión c.

El signo de interrogación (?) es equivalente a un único carácter.
  • Ejemplo: ls curso.te? lista el archivo curso.tex completando el último carácter.

Un conjunto de caracteres entre corchetes es equivalente a cualquier carácter del conjunto.
  • Ejemplo: ls curso_linux.t[aeiou]x lista curso_linux.tex seleccionando la e del conjunto.


En el mundo Linux/Unix existen tres grandes familias de Shells. Estas se diferencian entre sí básicamente en la sintaxis de sus comandos y en la interacción con el usuario.

SISTEMA OPERATIVO DE LINUX

GNU/Linux, también conocido como Linux, es un sistema operativo libre tipo Unix; multiplataforma, multi-usuario y multi-tarea. El sistema es la combinación de varios proyectos, entre los cuales destacan GNU y el núcleo Linux.


Como sistema operativo, Linux es muy eficiente y tiene un excelente diseño. Es multitarea, multiusuario, multiplataforma y multiprocesador; en las plataformas Intel corre en modo protegido; protege la memoria para que un programa no pueda hacer caer al resto del sistema; carga sólo las partes de un programa que se usan; comparte la memoria entre programas aumentando la velocidad y disminuyendo el uso de memoria; usa un sistema de memoria virtual por páginas; utiliza toda la memoria libre para cache; permite usar bibliotecas enlazadas tanto estática como dinámicamente; se distribuye con código fuente; usa hasta 64 consolas virtuales; tiene un sistema de archivos avanzado pero puede usar los de los otros sistemas; y soporta redes tanto en TCP/IP como en otros protocolos.

  • Contenido:
    1. Sistema de ficheros de LINUX 
    2. Interprete de comandos de LINUX (Shell)
    3. Principales ordenes de LINUX
    4. Configuración del entorno (variables)
    5. Entorno grafico Xwindows/X11
    6. Gestión de ventanas
    7. Procesos de LINUX
    8. Señales entre procesos
    9. Tareas programadas


SISTEMA DE FICHEROS DE LINUX

Linux soporta gran variedad de sistemas de ficheros, desde sistemas basados en discos, como pueden ser ext2, ext3, ReiserFS, XFS, JFS, UFS, ISO9660, FAT, FAT32 o NTFS, a sistemas de ficheros que sirven para comunicar equipos en la red de diferentes sistemas operativos, como NFS (utilizado para compartir recursos entre equipos Linux) o SMB (para compartir recursos entre máquinas Linux y Windows).

Los sistemas de ficheros indican el modo en que se gestionan los ficheros dentro de las particiones. Según su complejidad, tienen características como previsión de apagones, posibilidad de recuperar datos, indexación para búsquedas rápidas, reducción de la fragmentación para agilizar la lectura de los datos, etc. Hay varios tipos, normalmente ligados a sistemas operativos concretos. A continuación, se enumeran los más representativos:


  • ext2: Hasta hace poco era el sistema estándar de Linux. Tiene una fragmentación muy baja, aunque es algo lento manejando archivos de gran tamaño. Fue la continuación del sistema de ficheros ext, implementado en 1992 e integrado en Linux 0.96. Las principales ventajas que tenía sobre ext eran las siguientes:
    • Compatible con sistemas de ficheros grandes, admitiendo particiones de disco de hasta 4TB y ficheros de hasta 2GB de tamaño.
    • Proporciona nombres de ficheros largos, de hasta 255 caracteres.
    • Tiene una gran estabilidad.
    • Actualización.
  • ext3: Es la versión mejorada de ext2, con previsión de pérdida de datos por fallos del disco o apagones. En contraprestació, es totalmente imposible recuperar datos borrados. Es compatible con el sistema de ficheros ext2. Actualmente es el más difundido dentro de la comunidad GNU/Linux y es considerado el estándar. Sus ventajas frente a ext2 son:
    • Actualización. Debido a que los dos sistemas comparten el mismo formato, es posible llevar a cabo una actualización a ext3, incluso aunque el sistema ext2 esté montado.
    • Fiabilidad y mantenimiento.
  • ext4: Es la última versión de la familia de sistemas de ficheros ext. Sus principales ventajas radican en su eficiencia (menor uso de CPU, mejoras en la velocidad de lectura y escritura) y en la ampliación de los límites de tamaño de los ficheros, ahora de hasta 16TB, y del sistema de ficheros, que puede llegar a los 1024PB (Peta Bytes).
  • ReiserFS: Es el sistema de ficheros de última generación para Linux. Organiza los ficheros de tal modo que se agilizan mucho las operaciones con estos. El problema de ser tan actual es que muchas herramientas (por ejemplo, para recuperar datos) no lo soportan.
  • swap: Es el sistema de ficheros para la partición de intercambio de Linux. Todos los sistemas Linux necesitan una partición de este tipo para cargar los programas y no saturar la memoria RAM cuando se excede su capacidad. En Windows, esto se hace con el archivo pagefile.sys en la misma partición de trabajo, con los problemas que esto conlleva.