Nombre: Matrícula: Tema: Materia: Profesor:
Transcripción
Nombre: Matrícula: Tema: Materia: Profesor:
Nombre: Wandirys Lappost Díaz Matrícula: 2013-1534 Tema: Tubos, Redirección Materia: Sistemas Operativos 3 Profesor: José Doñé Índice 1. Introducción 2. Tubos, Redirección 2.1 Redireccionamiento Y Tuberías 2.1.1 Herramientas importantes 2.1.2 Ejecución de programas en Linux 2.2 Control De Procesos 2.2.1 Tuberías 2.2.2 Redirección 2.2.3 Redirección de escritura 2.2.4 Redirección de lectura 2.2.5 Combinaciones de teclas 2.3 La Entrada/Salida Y La Redirección 2.4 Uso de Tuberías (pipes) 2.4.1 Servicios 2.4.2 Procesos 3. Tubos y Redirecciones (Pipes and Redirection) 4. Un Poco Sobre Los Procesos 4.1 El Árbol De Los Procesos 4.2 Las Señales 5. Conclusión 6. Bibliografía Introducción Al comenzar este tema, conoceremos acerca de lo que es Tubos Y Redirección en Linux. Derivado de este, veremos de qué se trata, las herramientas más importantes, cómo se controlan esos procesos, cómo combinar las teclas, el uso de estos, entre otras más. En Linux existen 3 archivos muy importantes y que generalmente pasan desapercibidos. Estos se encuentran en /dev y son: stdin, stdout y stderr. Al desarrollo de este tema conoceremos aún más detalles. Tubos, Redirección Redireccionamiento Y Tuberías Herramientas importantes Un sistema Linux cuenta con gran cantidad de herramientas, cada una de las cuales realiza una labor muy específica pero rápidamente y bien; les presentamos unas cuantas típicamente usadas para procesar texto plano. Junto con cada herramienta presentamos algunas de sus opciones y ejemplos de su uso (la documentación completa de cada herramienta puede consultarse en la página del manual o en la documentación info). Éstas complementan algunas de las ya vistas anteriormente. Ejecución de programas en Linux La ejecución de programas (archivos) en Linux es solo una cuestión de permisos, por lo que podremos ejecutar cualquiera que tenga activado el bit de ejecución, por lo menos, en el usuario (si es un archivo nuestro). Para eso haremos uso del comando chmod a+x archivo, si por ejemplo queremos que sea ejecutable para todos. Una vez que ya es ejecutable, podemos solo escribir su nombre, precedido de la ruta al mismo para que se ejecute. Si estamos en el mismo directorio que el archivo será: $ ./archivo Control De Procesos Esto es algo muy interesante de manejar bien, puesto que son los trucos que nos hacen la vida más fácil desde la consola de comandos. Se trata de los atajos de teclado. Atajo ^d ^c Acción que realiza Envía un EOF al shell que causa una salida del modo edición. También sirve como atajo del comando exit, que permite salir de la sesión actual. Termina el proceso que esté en ejecución abruptamente. ^ z Pone el proceso en ejecución a dormir (como una pausa). No lo termina. ^l Realiza un clear pero manteniendo la linea en la que fue pulsada esta combinación de teclas. El bash entra en el modo 'reverse-i-search', que se utiliza para buscar comandos que fueron ejecutados anteriormente. En este modo el ^r usuario puede ir escribiendo parte de la linea de comandos que esta buscando, y el bash va mostrando la línea de comandos que el cree la más adecuada. Una vez has encontrado la que buscabas, enter. ^t Intercambia dos letras contiguas. Por ejemplo, si se escribe apt-gte, solo hay que colocarse después o en la 'e' y aplicarlo. Resultado: apt-get ^s ^q Bloquea el shell. Desbloquea el shell. También sirve para salir del man, info y top, como ejemplos. top Códigos de estado de procesos D Dormido en forma ininterrumpible R Corriendo o en cola S Dormido a la espera de un evento T Parado momentaneamente a la espera de uan señal de control W Paginado X Muerto (nunca debería aparecer uno de estos) Z Proceso "zombi" nl, head, tail Permiten ver uno o más archivo o parte de uno o más archivos. Complementan el uso de cat, more y less que ya vimos antes. En el caso de nl, nos muestra un cat, pero con los números de línea a la izquierda de cada línea. Esto nos puede servir para identificar alguna parte de un texto que queramos tratar luego. $ nl archivo.txt 1 una línea 2 otra 3 y otra más $ cat archivo.txt una línea otra y otra más En el caso de head y tail, nos muestran las primeras o las últimas 10 líneas de uno o más archivos, respectivamente. Veamos el ejemplo en un mismo archivo: $ cat archivo.txt La criptografía es la disciplina de la computación que trata de la transmisión y almacenamiento de datos de manera que no puedan ser comprendidos ni modificados por terceros. La criptografía cuántica es una de las primeras aplicaciones de la computación cuántica cercana a una fase de producción masiva. La criptografía cuántica garantiza absoluta confidencialidad de la información transmitida por fibras ópticas, almacenando información en el elemento constituyente de la luz, el fotón. $ head archivo.txt La criptografía es la disciplina de la computación que trata de la transmisión y almacenamiento de datos de manera que no puedan ser comprendidos ni modificados por terceros. La criptografía cuántica es una de las $ tail archivo.txt La criptografía cuántica garantiza absoluta confidencialidad de la información transmitida por fibras ópticas, almacenando información en el elemento constituyente de la luz, el fotón. split Divide un archivo empleando como criterio el tamaño del mismo. Acepta como opciones (-b) bytes o (-l) líneas. Por ejemplo, para dividir un archivo grande en partes de 100000 bytes: $ split -b 100000 grande Las partes quedarán en archivos con nombres como xaa, xab, etc. Sin desechar el archivo original! Con el ejemplo anterior, se vería así: $ split -l 4 archivo.txt $ ls archivo.txt xaa xab xac xad xae xaf $ cat xaf almacenando información en el elemento constituyente de la luz, el fotón. sort Por defecto, ordena las líneas de un archivo, con la opción -m mezcla dos archivos ordenados y con la opción -c verifica que un archivo esté ordenado. Al ordenar puede considerar las líneas completas, considerarlas números enteros (-n) o flotantes (-g), considerarlas meses (-M) o dividirlas en campos y emplear algunos campos como llaves de ordenamiento (opción -k para especificar llaves y -t para cambiar separador de campos). En las comparaciones puede ignorar diferencias entre mayúsculas y minúsculas con la opción -f, puede ordenar de mayor a menor con la opción -r (por defecto ordena de menor a mayor) y puede eliminar líneas repetidas con la opción -u.Por ejemplo para ordenar por líneas el archivo nombres.txt: $ sort nombres.txt Acuña Rolando Gomez Claudio Perez José Rivero Jacinto si cada línea del archivo nombres.txt tiene el apellido y después el nombre de una persona separados por espacios, puede ordenarse por nombre con: $ sort -k 2 nombres.txt Gomez Claudio Rivero Jacinto Perez José Acuña Rolando Es importante entender que sort no guarda el ordenamiento, solo muestra por la stdout la lista ordenada. wc Cuenta cantidad de palabras, líneas y caracteres en uno o más archivos. Por defecto presenta los tres datos por cada archivo que reciba y después presenta las sumas. Con la opción -c presenta la cuenta de palabras, con -l la cuenta de líneas, con -w la cuenta de palabras y con -L la longitud de la línea más larga. Para los archivos de ejemplo anteriores: $ wc nombres.txt 4 8 54 nombres.txt $ wc archivo.txt 25 72 513 archivo.txt Siempre el orden de la salida es: Líneas Palabras Bytes Nombre_de_archivo Tuberías Podríamos representar cada programa como una caja negra que tiene una entrada y una salida que se pueden unir entre ellos. Debido a que la entrada por defecto es el teclado y la salida por defecto es terminal, graficaremos cuando sea necesario ambos. El ejemplo que utilizamos se encuentra esquematizado en la figura Siendo la entrada estándar el teclado y la salida estándar el terminal o por simplicidad la pantalla. Vamos a suponer un caso ficticio donde necesitamos todas las definiciones de cada palabra en un texto. Primero las ordenamos alfabéticamente, luego utilizamos un comando ficticio llamado diccionario que toma palabras de la entrada estándar y las reescribe junto a su significado en la salida estándar. Su esquema se ve en la figura: En este caso nombramos por separado las entradas y salidas estándares de los dos programas, pero la unión entre ambos programas se puede considerar como un sólo tubo. En ese tubo, el flujo está en un estado intermedio, donde está ordenado, pero no tiene las definiciones de diccionario. En la línea de comandos esto se escribe de la siguiente manera: $ sort | dicccionario Donde el carácter " | " representa la conexión entre la salida estándar de un programa y la entrada estándar de otro. Con este fuerte y simple concepto se pueden concatenar gran cantidad de programas como si fuera una línea de producción en serie para generar resultados complejos. Para mejorar nuestro ejemplo sacaremos las palabras repetidas, antes de mostrarlas con definiciones. Suponiendo que exista un programa llamado sacarrepetidas, la línea de comando sería: $ sort | sacar-repetidas | diccionario Simple, utilizando herramientas sencillas logramos algo un poco más complicado. El inconveniente que tenemos en este ejemplo es que hay que escribir aquello a procesar. Normalmente queremos utilizar archivos como entrada de nuestros datos. Es necesario un comando que envíe a la salida estándar un archivo, así se procesa como la entrada estándar del sort y continúa el proceso normalmente. Este comando es cat. La sintaxis es simple cat nombre-de-archivo Quedando nuestro ejemplo: $ cat archivo.txt | sort | sacar-repetidas | diccionario ... esto crea un glosario de las palabras que se encuentren en archivo.txt La combinación de comandos es incalculable y brinda posibilidades enormes. Veamos algunos ejemplos. En el caso que se quieran buscar procesos con el string http: $ ps ax | grep http 3343 ? S 0:00 httpd -DPERLPROXIED -DHAV 3344 ? S 0:00 httpd -DPERLPROXIED -DHAV 3975 ? S 0:00 httpd -DPERLPROXIED -DHAV 12342 pts/6 S 0:00 grep http Si queremos eliminar la última línea podemos volver a usar grep con la opción v $ ps ax | grep http | grep -v grep 3343 ? S 0:00 httpd -DPERLPROXIED -DHAV 3344 ? S 0:00 httpd -DPERLPROXIED -DHAV 3975 ? S 0:00 httpd -DPERLPROXIED -DHAV Se pueden filtrar las líneas que contengan la palabra linux del archivo arch1.txt y luego mostrarlas en un paginador como less. $ cat arch1.txt | grep linux | less Podemos enviar los resultados por correo a un amigo, con un asunto que diga "Tu archivo". $ cat arch1.txt | grep linux | mail -s 'Tu archivo' [email protected] Redirección En repetidas ocasiones en la vida de un sistema es mejor tener todo en archivos, ya sea para guardar algún historial o para automatizar ciertas funciones dentro de scripts. Para almacenar o sacar información de archivos y vincularlas con entradas o salidas estándares se utilizan las Redirecciones. La redirección se expresa con los símbolos "Mayor" > y "Menor" <. Y se pueden utilizar en forma simple o doble. Utilizando el comando cat se puede de arch1.txt a arch2.txt utilizando redirección. hacer una copia $ cat arch1.txt > arch2.txt O se puede redireccionar un archivo para visualizarlo con el comando less. $ less < arch1.txt Redirección de escritura Para escribir un archivo se utiliza >. Hay que tener mucho cuidado de no borrar un archivo sobrescribiéndolo. Cuando se utilizan redirecciones, debido a su utilidad en los scripts, "no se realizan confirmaciones". Si el archivo a escribir ya existe desde antes, el redireccionador > lo sobrescribe con flujo de texto nuevo. En cambio el operador >> realiza un agregado de texto en el flujo existente. No hay nada mejor que un ejemplo clarificador: $ escribe-en-salida-estandar > archivo.txt El (falso) comando escribe-en-salida-estándar justamente hace eso, escribe unas cuantas cosas en salida estándar. Puede ser un comando ls, un comando cal (calendario) o cualquier comando antes visto, así como también una combinación de comandos por tuberías. En este punto, el contenido de archivo.txt es lo mismo que saldría en pantalla. Si ejecutamos otro comando redireccionado aarchivo.txt (nuevamente), éste pierde su contenido y el resultado de la operación pasa a estar en el mismo. Cuando se necesita tener una lista de acontecimientos, no se quiere que un acontecimiento nuevo borre a todos los anteriores. esto agregamos en vez de sobrescribir. $ echo Este es el acontecimiento Nro. 1 > bitacora.log Para lograr $ echo Este es el segundo acontecimiento >> bitacora.log Va a escribir dos líneas en el archivo bitacora.log sin eliminar nada. Ejemplo: Si queremos combinar el ejemplo de las tuberías con lo aprendido recientemente podríamos escribir: $ cat archivo.txt | sort | sacar-repetidas | diccionario >> glosario.txt Redirección de lectura Para la lectura es el símbolo menor < y se utiliza de la siguiente manera: $ comando-que-acepta-stdin < archivo-de-entrada.txt Como por ejemplo: $ mail [email protected] [email protected] < correo.txt Dónde correo.txt podría ser un archivo que se genere automáticamente... así como su contenido. Otra facilidad para redireccionar entrada estándar es <<, que después de un comando, permite ingresar, por teclado, un texto que se constituirá en la entrada estándar. A continuación de << debe ponerse una palabra, que indicará fin de entrada (en nuestro ejemplo, chau). La entrada estándar constará de las líneas que se digiten a continuación hasta la primera que contenga sólo la palabra que indicaba fin de entrada. Por ejemplo: $ sort <<chau > Perú > Argentina > Brasil > chau Argentina Brasil Perú ordenará las palabras dadas (excepto chau que indica el fin de la entrada). Así, << es equivalente a editar un archivo y después redireccionarlo a la entrada estándar de un programa. Combinaciones de teclas [Ctrl]+[Alt]+[Del] Shutdown. Apaga el sistema de forma organizada desde una terminal texto. [Ctrl]+[Alt]+[F1] Cambia a la primera terminal de texto. [Ctrl]+[Alt]+[Fn] Cambia a la terminal de texto numero n (n=1,...,6) [Ctrl]+[Alt]+[F7] Cambia a la primera terminal X (si se está usando alguna) [Ctrl]+[Alt]+[Fn] Cambia a la terminal X numero n (n=7,...,12) [Tab] Auto-completa el nombre de un mandato, archivo, directorio, programa. Cuando trabajamos en una terminal texto. [ArrowUp] (Flecha arriba) Va editando la historia de mandatos que hemos escrito anteriormente en terminal texto. [Shift][PgUp] Scroll la salida de la terminal hacia arriba, en terminal texto. [Shift][PgDown]: Scroll la salida de la terminal hacia abajo, en terminal texto. [Ctrl]+c Termina el proceso actual. Si no está corriendo de fondo [Ctrl]+d Termina la terminal actual. También es la combinación para el comando exit. [Ctrl]+s Para la transferencia a la terminal. [Ctrl]+z Manda el proceso actual a correr de fondo. La Entrada/Salida Y La Redirección En cada sesión Unix tres archivos predeterminados son abiertos: estándar de entrada, de salida y de error. La entrada es el lugar desde donde un comando obtiene la información necesaria de entrada. Habitualmente, por omisión, ésta será el teclado. La salida es el lugar a donde un comando envía el resultado de su ejecución, por omisión, este lugar será la pantalla). Error es el lugar donde el sistema operativo envía cualquier mensaje de error que se produzca, por omisión, será la pantalla. El proceso tal cual lo acabo de describir ahora es conocido habitualmente como entrada/salida estándar. No obstante, este comportamiento es susceptible de ser modificado, según sean nuestras necesidades, gracias a cuatro tipos de redireccionamiento que emplea la shell: < (signo menor que): Acepta la entrada de un archivo. > (signo mayor que): Envía la salida estándar a un archivo. >> (signo mayor que dos veces): Añade la salida estándar a un archivo. | (barra vertical): Conecta la salida estándar de un comando con la entrada estándar de otro. Este redireccionamiento es también conocido como tubería o pipe y es uno de los más usados en linux. Un ejemplo de esto podría ser el siguiente: ls -l >ListadoDir1.txt que enviará la lista del directorio al archivo ListadoDir1.txt . Usando la redirección, la entrada estándar y/o salida estándar podrá ser referenciada desde ficheros con toda la capacidad y potencia que ello ofrece. Deberá tenerse en cuenta, asimismo, que el uso de > (mayor que) para redireccionar la salida a un fichero que ya exista, es destructivo, es decir, la orden del ejemplo de antes: ls -l >ListadoDir1.txt sobrescribirá el contenido del fichero ListadoDir1.txt . Si en su lugar, usamos el símbolo >> (doble signo mayor que), la salida será añadida al final del fichero nombrado, en lugar de ser sobrescrito. Uso de Tuberías (pipes) El uso de tuberías (pipes) es la característica de la Shell, que nos permite conectar una cadena de órdenes en una tubería, donde la salida estándar de la primera es enviada directamente a la entrada estándar de la segunda y así sucesivamente. Si quisiéramos conectar la salida de la orden ls con la entrada de la orden sort. Para crear un pipe se usa el símbolo |: ls /usr | sort -r Imaginemos que la salida de las órdenes entubadas con anterioridad fuera muy grande, podríamos querer añadir a la tubería la orden more para poder examinar los resultados con comodidad del siguiente modo: ls /usr | sort -r | more Servicios Los servicios, normalmente, en Linux se sitúan en un directorio cuya ruta es: /etc/init.d y linux los carga al arrancar si están situados allí. A los servicios se les llama en linux también demonios (daemons). Por tanto, una aplicación de tipo daemon equivale a un servicio de tipo demonio. Todos los scrips que se encuentran en init.d se consideran demonios (el concepto es similar al de servicio en Windows). Generalmente la mayor parte de estos servicios son, en realidad, scripts de la shell que arrancan programas colocados en otros sitios dándoles losParámetros requeridos para su correcta ejecución. Un claro ejemplo suele ser el script para arrancar el daemon BRLTTY que se encarga de leer la consola a través de la línea braille y que, Posiblemente en futuras lecciones nos introduzcamos ligeramente en él. Si quieres ver los demonios cargados en tu sistema echa un vistazo a su directorio: /etc/init.d Procesos Un proceso es un programa en ejecución que queda bajo el control de la Shell. GNULinux es multitarea, por lo tanto, asigna intervalos de tiempo a las tareas según un esquema de prioridades. Cuando la Shell ejecuta un programa se crea un proceso nuevo con un número entre el 1 y 30.000 (PID). Cuando existe Un proceso que crea a otro se le denomina proceso padre y al creado proceso hijo. Este va a heredar casi la totalidad del entorno del padre (incluyendo las variables...) pero sólo puede modificar el suyo y no el de su creador. Cada proceso posee también un número de grupo de procesos (PGID). La orden para saber información sobre los procesos (aplicaciones en ejecución) que están en marcha en un momento determinado: es ps ps (muestra el número de proceso PID, el terminal, el tiempo en ejecución, y el comando y se refiere a nuestra sesión). ps -e: muestra información extendida de todos los procesos lanzados en todos los terminales (gráficos y de texto). El tipo de salida por pantalla tendrá el mismo formato que el anterior. ps -f Además muestra el PPID proceso padre, uso del procesador y tiempo de comienzo. ps -j Muestra el PGID. Normalmente, un proceso padre espera a que finalice uno hijo, devolviéndole el hijo un valor para informarle sobre cómo ha ido la ejecución (si valor=0 -finalizó sin errores; si valor distinto 0 -algo ocurrió). Asimismo, Si un proceso se lanza varias veces, la primera se considera proceso padre y el resto procesos hijos. La tarea que haría el proceso padre se reparte entre todos los procesos hijos. Si un proceso hijo muere o es matado, es decir, se apaga, no ocurre ningún problema pero si se para el proceso padre, afectará a todos los procesos hijos La salida de la orden ps aparece reflejada en columnas con los siguientes datos: uid: usuario que lanza el proceso pid: identificador de procesos. Valor numérico que genera el sistema de forma automática. ppid: identificador del proceso padre. stime: la hora en que el proceso fue iniciado. tty: indica el terminal desde el que se ha lanzado la aplicación. La interrogación se refiere a procesos que no estan name: nombre de la aplicación que se ha lanzado. Para ver sólo la línea referente al proceso sobre el que se quiere información se puede utilizar una tubería a la orden grep. Esta órden nos permite especificar una cadena de caracteres a localizar. Por ejemplo: Para buscar los procesos relacionados con el programa BRLTTY que maneja a la línea braille, el comando se podría introducir del siguiente modo: ps -ef | grep BRL lo cual solamente tratará de localizar procesos que contengan la cadena BRL en su nombre. La orden para detener Un proceso es kill. A esto, habitualmente se le llama matar un proceso y suele hacerse cuando una aplicación se cuelga. Incluso podremos matar una consola entera desde otra cuando el cuelgue es tal que no nos permite hacer nada en ésa. Su sintaxis es la siguiente: kill númeroproceso Hay que comprobar previamente el número del proceso (PID) con la orden ps tal como lo hemos hecho más arriba. Luego se utilizará el comando kill seguido de un espacio y el número del proceso que queramos matar. Si, por ejemplo, tuviéramos un terminal bloqueando el sistema, podríamos "matarlo" averiguando el número del proceso para el terminal: /etc/init.d ps -ef|grep tty3 Si la respuesta que sale por pantalla fuera: nombreterminal 2429 1 0 07:37 tty3 00:00:00 -sh Escribiríamos la orden kill utilizando el número como parámetro: /etc/init.d del modo que sigue: kill -3 2429 Para matar procesos que están en modo gráfico usaremos la orden xkill Un proceso que está corriendo, para el shell, se denomina tarea. Los términos proceso y tarea, son intercambiables. Sin embargo, se suele denominar «tarea» a un proceso, cuando es usado con el control de tareas, que es una característica del shell que permite cambiar entre las diferentes tareas que puedan estar corriendo simultáneamente. En la mayor parte de las ocasiones, como creo haber comentado ya, solamente se suele correr un programa a la vez y, al menos a mí, me resulta más sencillo abrir un par de terminales y ejecutar un programa por terminal, Sin embargo, si utilizamos el control de tareas, podremos ejecutar diferentes tareas a la vez y podremos, asimismo, ir cambiando de una a otra según lo vayamos necesitando. Pasar tareas a primer Plano y Segundo Plano: Cada programa que esté corriendo en la Shell puede estar trabajando en dos modalidades: o en Primer plano o en Segundo plano. Solo puede haber un proceso en primer plano al mismo tiempo, pero puede haber tantos en segundo plano como queramos o como la memoria y/o la capacidad del microprocesador nos permita. El proceso que esté en primer plano, es el que va a interactuar con el usuario, recibiendo la entrada standard, o no, y enviando los resultados de salida, generalmente a la pantalla caso de que no se haya redirigido la salida. Los procesos en segundo plano, habitualmente, no van a recibir ninguna señal desde el teclado, es por ello, que se ejecutan en silencio sin necesidad de interacción. Todos los procesos pueden ser suspendidos, no se confunda esto con matarlos: Un proceso suspendido es aquel que no se está ejecutando actualmente, sino que esta temporalmente parado, mientras que se dice que un proceso está muerto, generalmente cuando se pulsa la combinación de teclas Control+c, cuando es detenido totalmente y eliminado de la memoria de trabajo liberando los recursos del sistema que en ese momento estaba consumiendo. Tras haber suspendido una tarea, puede indicársele que continúe ejecutándose, tanto en primer plano como en segundo, según sea nuestra necesidad. Reanudar una tarea que haya sido suspendida no cambia en nada su estado, la tarea proseguirá con su ejecución justo en el preciso lugar en el que había sido detenida. Si se mata o elimina un proceso, éste no puede continuar ejecutándose, y deberá ser lanzado otra vez para volver a realizar sus tareas. También se puede dar el caso de que algunos programas estén capturando la interrupción, de modo que pulsando Control+C no conseguimos que se detengan instantáneamente. Esto ocurre debido a que de este modo se permite al programa realizar operaciones necesarias de limpieza antes de terminar. De hecho, algunos programas simplemente no se dejan matar por ninguna interrupción. Envío de tareas a Segundo Plano: Una forma de mandar procesos a segundo plano es añadiendo un carácter & al final de cada comando. yes > /dev/null & Como respuesta, el sistemma nos enviará por pantalla el número del proceso que envió a segundo plano seguido de su pid. Para chequear el estado del proceso, usaremos la orden interna de la shell jobs: jobs [1]+ Running yes >/dev/null & Esto nos indica que tenemos al proceso 1 corriendo en segundo plano enviando el proceso yes al dispositivo null. Tenemos una segunda forma de poner una tarea en segundo plano. Lo lanzaremos como un proceso normal, es decir, en primer plano, lo detenemos, y después lo volvemos a lanzar en segundo plano. Esto es: lanzamos el proceso yes en primer plano con cualquier aplicación en modo normal, yes > /dev/null Debido a que yes está corriendo en primer plano, no nos debería mostrar el indicativo de la shell. Seguidamente,en lugar de interrumpir la tarea con Control+C, suspenderemos la tarea con su combinación de teclas que, habitualmente, suele ser Control+Z. El sistema nos debería dar un mensaje del estilo de: [1]+ Stopped yes >/dev/null ocurrido esto, podemos relanzarla de nuevo en el lugar donde se detuvo pulsando otra vez la combinación Control+z. Si queremos que la tarea se relance en primer plano, utilizaremos la orden fg tras lo que la Shell volverá a mostrarnos el nombre del comando de nuevo, para mostrarnos el nombre de la tarea que se ha puesto en primer plano. Si en su lugar tecleásemos la orden bg pondríamos la tarea en segundo plano. Esto hará que el comando siga ejecutándose igual que si lo hubiese hecho desde el principio con & como en la primera manera en que lo hicimos. Cuando tenemos una tarea en segundo plano deberemos tener en cuenta que si intentamos pararla pulsando Control+Z no funcionará, La solución es poner el proceso en primer plano de nuevo, con la corden fg, y entonces pararlo. Si no te interesa ver la salida de cualquier tarea que, estando en segundo plano muestre texto en pantalla, no te olvides de redirigir su salida estándar hacia eldispositivo /dev/null. Asimismo aclarar que, normalmente, los comandos fg y bg actúan sobre el último proceso parado (indicado por un + (signo más) junto al número de tarea cuando utilizamos la orden jobs). Si tenemos varios procesos corriendo a la vez, podremos enviar a primer o segundo plano una tarea específica indicando el ID de tarea como argumento de fg o bg. bg %3 para la tarea de segundo plano número 3. No se pueden usar los ID de proceso con fg o bg. Además de esto, si usas el número de tarea por sí solo, como en: %2 Es equivalente a: fg %2 Tubos y Redirecciones (Pipes and Redirection) Algunos Conceptos En Linux existen 3 archivos muy importantes y que generalmente pasan desapercibidos. Estos stdin, stdout y stderr. se encuentran en /dev y son: STDIN: es el “STandarD INput” o entrada estándar, es el lugar en donde un proceso toma generalmente su entrada, por defecto el teclado. El archivo /dev/stdin es simplemente un archivo que apunta a tu terminal/consola. Si ejecutas el comando cat sin parámetros podrás ver que toma cualquier carácter desde la entrada estándar (el teclado). Para cortar el proceso usa Control+C # cat Si ejecutas el comando cat /dev/mouse, al mover el mouse verás la aparición de diversos caracteres basura. En este caso le indicamos al comando cat que nuestro stdin será /dev/mouse. Lo mismo sucedería si quisiéramos recibir información a través del puerto serie COM1: cat /dev/ttyS0 En estos casos hemos hecho una redirección cambiando la entrada estándar stdin por otra. Si bien los comandos funcionaron bien, para graficar correctamente este cambio los comandos deberían llevar el carácter de redirección de entrada “<” # cat < /dev/mouse # cat < /dev/ttyS0 STDOUT: es el “STandarD OUTput” o salida estándar, es el lugar en donde un proceso generalmente escribe su salida, por defecto, la pantalla. El archivo /dev/stdout es un archivo que apunta, también, a tu terminal/consola. Un comando ls envía por defecto la salida a la pantalla. Pero si agregamos el carácter de redirección de salida “>” podemos enviarlo a cualquier otro lado. Por ejemplo, si quisiéramos hacer un listado de archivos la carpeta /bin seguramente veríamos pasar por pantalla muy rápidamente toda la lista de archivos y podríamos leer solo la última parte (unas 20 líneas). Esto lo podríamos solucionar enviando la salida estándar a un archivo y luego inspeccionar el archivo más detenidamente, de la siguiente manera: # ls /bin > misalida.txt; more <misalida.txt En el ejemplo he concatenado dos comandos con “;“. Al finalizar el primero se ejecutará el segundo. También notarás que he redireccionado la salida estándar al archivo misalida.txt (en lugar de mostrarse en pantalla se guardará todo en un archivo) y luego redireccioné la entrada estándar usando ese mismo archivo. STDERR: es el “STandarD ERRor” o error estándar, es el lugar en donde un proceso generalmente escribe los mensajes de errores, por defecto la pantalla. Quizás se habrán dado cuenta que el comando cat /dev/mouse puede haberles dado error si no lo ejecutaron como root: cat: /dev/mouse: Permission denied Este mensaje es una salida stderr. Imagínense ejecutar un comando que genera muchas líneas de salida y quizás muchos errores, que seríamos incapaces de leer, dada la velocidad con la que aparecen en nuestra pantalla. Un ejemplo de esto es cuando usamos el comando tar como un usuario común: $ tar cvf procs.tar /proc Este comando generará una larga salida con errores debido a los permisos y a que algunos archivos permanecen abiertos. Para analizar bien deberíamos redireccionar las salidas para leerlas con más tranquilidad y en detalle: $ tar cvf procs.tar /proc >detalle.txt 2>errores.txt Con este comando direccionamos la salida estándar al archivo detalle.txt y los errores estándar al archivo errores.txt. ¿Por qué hay un número 2 antes de > en el comando? Este número indica la salida: 0 = stdin, 1 = stdout, 2 = stderr. Si no colocara el número 2, los archivos detalle.txt y errores.txt contendrían exactamente la misma información: sólo la salida estándar, ya que los errores nunca se almacenarían. En “humano” el comando sería: Crear un archivo tar llamado procs.tar, todo el detalle de la salida direccionarlo al archivo detalle.txt y los errores generados enviarlos al archivo errores.txt Otra buena opción a esta redirección es: $ tar cvf procs.tar /proc >procs.txt 2>&1 Este comando pone stdout en el archivo procs.txt así como también se envían los errores a &1 que es la salida estándar, o sea que también van a parar al archivoprocs.txt. De esta manera tenemos stdout y stderr en un mismo archivo. ¿> o >>? Cuando utilizamos un solo símbolo >, estamos indicando que se cree un archivo que contendrá la salida estándar. Si el archivo existe, se sobrescribirá. Si queremos agregar a ese archivo basta con indicar dos caracteres >> (cuando el archivo destino no exista lo creará). En una depuración de comandos es bueno realizar el agregado con >>, de lo contrario perderíamos la primera información: $ tar cvf bins.tar /bin >detalle.txt 2>errores.txt $ tar cvf procs.tar /procs >>detalle.txt 2>>errores.txt Al ejecutar ambos comandos, la salida se agregará en detalle.txt y los posibles errores quedarán registrados en errores.txt. Pipe o tubo. Se utiliza para unir comandos, donde la salida del primer comando es la entrada del segundo. Se representa por el carácter | . Uno de los usos más comunes es pausar un listado muy largo para analizar en detalle: $ cat archivo.txt | more La salida de cat es la salida estándar (pantalla), pero al utilizar el pipe esa salida la entubamos hacia la entrada del comando more. Otro ejemplo sería redireccionando varios comandos: $ ps ax | grep ssh | grep -v grep Aquí realizamos un ps ax que nos mostraría la lista completa de procesos, al filtrar con grep ssh solo nos mostraría aquellas líneas que contengan la palabra ssh, pero como el mismo comando grep ssh aparece y no nos interesa, volvemos a filtrar con grep quitando las líneas que contengan la palabra grep (grep -v grep). Un ejemplo muy útil para matar todas las instancias de ssh sería como sigue: $ for pid in `ps ax | grep sshd | grep -v grep | awk {'print $1'}`; do kill -9 $pid; done Explicando: realizamos un bucle con for, el cual toma cada línea de lo que está dentro de las comillas ` ` y luego hace un kill -9 de cada resultado. Fíjense que es igual al ejemplo anterior, solo que hemos agregado el uso de awk para mostrar el primer campo (que es el pid, Process ID). Si ejecutamos ps ax | grep sshd | grep -v grep | awk {‘print $1′} nos daría una lista de PIDs de cada instancia de sshd. Al estar dentro del bucle for, procesaríamos cada pid con el comando kill. Para no tener que recordar todo este comando podríamos crear un script y usar variables para pasar la búsqueda de procesos: $ cat mataprocesos #!/bin/bash #$1 es el primer valor que toma de línea de comandos rm /tmp/mataprocesos.err PROCESO=$1 if [ -z $PROCESO ]; then echo "Debe ingresar el nombre de proceso" echo "Uso:" echo " mataprocesos <nombre-proceso>" exit fi for NROPID in `ps ax | grep $PROCESO | grep -v grep | awk {'print $1'}`; do kill -9 $NROPID 2>> /tmp/mataprocesos.err; done SIZE=`stat -c %s /tmp/mataprocesos.err` if [ "$SIZE" -ne 0 ]; then echo "Errores producidos" more /tmp/mataprocesos.err fi Le damos permisos de ejecución y si queremos le hacemos un link simbólico dentro de /usr/bin para que sea accesible desde cualquier punto. Un Poco Sobre Los Procesos El Árbol De Los Procesos Al igual que con los archivos, todos los procesos que corren en un sistema Linux están organizados en forma de árbol, y cada proceso tiene un número (su PID, Process ID, «identificador de procesos»), junto con el número de su proceso padre (PPID, Parent Process ID, «identificador del proceso padre»). Esto significa que hay un proceso en el tope de la estructura de árbol, el equivalente de la raíz para los sistemas de archivos: init (ver el Manual de Referencia), que siempre posee el número 1. Las Señales Cada proceso en Unix puede reaccionar a las señales que se le envían. Existen 31 señales diferentes. Para cada una de estas señales el proceso puede redefinir el comportamiento predeterminado, excepto para dos de ellas: la señal número 9 (KILL), y la señal número 19 (STOP). La señal 9 «mata» un proceso, sin darle tiempo de terminar correctamente. Esta es la señal que deberá enviar a un proceso cuando este está trabado o exhibe otros problemas. Está disponible una lista completa de las señales usando el comando kill -l. Obtener información sobre los procesos: ps y pstree. Estos dos comandos muestran una lista de los procesos presentes en el sistema de acuerdo con los criterios que Ud. quiera. ps Al enviar este comando sin un argumento se mostrarán solo los procesos iniciados por Ud. en la terminal que está utilizando: $ ps PID TTY TIME CMD 5162 ttya1 00:00:00 zsh 7452 ttya1 00:00:00 ps Las opciones son numerosas, citaremos las más comunes: a: también muestra los procesos iniciados por los otros usuarios; x: también muestra los procesos sin terminal de control alguna (esto se aplica a casi todos los servidores); u: muestra, para cada proceso, el nombre del usuario que lo inició y la hora a la cual fue iniciado. Hay muchas otras opciones. Refiérase a la página de manual para más información (man ps). La salida de este comando está dividida en campos diferentes: el que más le interesará es el campo PID, que contiene el identificador del proceso. El campo CMD contiene el nombre del comando ejecutado. Una forma muy común de invocar a ps es la siguiente: PID TTY STAT TIME COMMAND 1 ? Ss 0:00 init [3] 2 ? S 0:00 [migration/0] 3 ? SN 0:00 [ksoftirqd/0] 4 ? S 0:00 [watchdog/0] 5 ? S< 0:00 [events/0] 6 ? S< 0:00 [khelper] 7 ? S< 0:00 [kthread] 10 ? S< 0:00 [kblockd/0] 11 ? S< 0:00 [kacpid] 72 ? S< 0:00 [cqueue/0] 75 ? S< 0:00 [khubd] 77 ? S< 0:00 [kseriod] 136 ? S 0:00 [pdflush] 137 ? S 0:00 [pdflush] 138 ? S< 0:00 [kswapd0] 139 ? S< 0:00 [aio/0] pstree: El comando pstree muestra los procesos en forma de estructura de árbol. Una ventaja es que Ud. puede ver inmediatamente quien es el proceso padre de otro: cuando quiere matar toda una serie de procesos, y si son todos padres e hijos, es suficiente matar al ancestro común. Ud. puede usar la opción -p, que muestra el PID de cada proceso, y la opción -u que muestra el nombre del usuario que inició el proceso. Como generalmente la estructura de árbol es grande, es más fácil invocar a pstree de la siguiente manera: Esto le da una visión general de toda la estructura de árbol de los procesos. Envío de señales a los procesos: kill, killall y top. Los dos comandos que se usan para enviar señales a los procesos son: El comando kill que necesita el número de un proceso como argumento, mientras que el comando killall necesita el nombre de un comando. Los dos comandos opcionalmente pueden recibir el número de una señal como argumento. Predeterminadamente, ambos envían la señal 15 (TERM) a el o los procesos relevantes. Por ejemplo, si quiere matar el proceso con PID 785, Ud. ingresa el comando: $ kill 785 Si quiere enviarle la señal 9, Ud. ahora ingresa: $ kill -9 785 Supongamos que quiere matar un proceso del cual Ud. conoce el nombre del comando. En vez de encontrar el número de proceso usando ps, puede matar el proceso directamente: $ killall -9 netscape Conclusión Al concluir este tema conocimos cada uno de los detalles acerca de los tubos y redirecciones. Vimos los diferentes comandos que se utilizan, así como el momento en que se pueden utilizar, así como sus beneficios y lo que nos permite. Bibliografía http://wiki.xtech.com.ar/index.php/Redireccionamiento_y_tuberias http://www.nodo50.org/utlai/joomla/index.php/softlibre/41-apuntes-sobrelinux/134-13-la-entradasalida-y-la-redireccion.html https://jinetedeldragon.wordpress.com/2009/05/25/tubos-y-redireccionespipes-and-redirection/ http://naizona.blogspot.com/2009/07/redirecciones-y-tuberias.html