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

Documentos relacionados