miércoles, 8 de julio de 2009

Redirecciones y Tuberías en Linux

Cada proceso Unix (esto también incluye a las aplicaciones gráficas) abre un mínimo de tres descriptores de archivo: la entrada estándar, la salida estándar, y el error estándar. Sus respectivos números son 0 (<), 1 (>) y 2 (> /dev/null). En general, estos tres descriptores están
asociados con la terminal desde la cual se inició el proceso, siendo el teclado la entrada. El objetivo de las redirecciones y las tuberías es redirigir estos descriptores. Los ejemplos en esta sección lo
ayudarán a comprender mejor.

Redirecciones
Suponga, por ejemplo, que Ud. quiere una lista de los archivos que terminan en .gif en el directorio images. Esta lista es muy larga, por lo que Ud. quiere almacenarla en un archivo para consultarla a gusto después. Ud. puede ingresar el comando siguiente:

$ ls images/*.gif > lista_de_archivos

Esto significa que la salida estándar de este comando (1) se redirecciona (>) al archivo denominado lista_de_archivos. El operador > es el operador de redirección de la salida. Si el archivo de redirección no existe, se crea, pero si existe se sobre-escribe su contenido. Sin embargo, es el descriptor predeterminado que redirecciona este operador es la salida estándar y no es necesario especificarla en la línea de comandos. Ud. podría haber escrito simplemente:

$ ls images/*.gif > lista_de_archivos

y el resultado será exactamente el mismo. Luego, Ud. puede mirar el archivo usando un visualizador de archivos de texto tal como less, more, etc.

Imagine ahora que Ud. quiere saber cuantos de estos archivos hay. En vez de contarlos a mano, Ud. puede usar el utilitario denominado wc (Word Count, «contador de palabras») con la opción -l, que escribe en la salida estándar el número de líneas en el archivo. Una solución es la siguiente:

$ wc -l < style="text-align: justify;">y esto da el resultado deseado. El operador <>
$ wc -l < style="text-align: justify;">Las tuberías (pipes, en inglés) son de alguna forma, una combinación de redirecciones de la entrada y la salida. Su principio es el de un tubo, de aquí el nombre: un proceso envía datos por un extremo del tubo y otro proceso lee los datos en el otro extremo. El operador de la tubería es |.
Volvamos al ejemplo de la lista de archivos. Suponga que Ud. quiere encontrar directamente cuantos archivos hay sin tener que almacenar la lista en un archivo temporal, entonces Ud. usa el comando siguiente:

$ ls images/*.gif | wc -l

lo cual significa que la salida estándar del comando ls (es decir, la lista de archivos) se redirecciona a la entrada estándar del comando wc. Ud. obtiene así, el resultado deseado.
Las tuberías y las redirecciones no están limitadas solamente a texto que puede ser leído por seres humanos. Por ejemplo, el comando siguiente enviado desde una xterm:

$ xwd -root | convert - /mi_escritorio.gif

Hará una captura de pantalla de su escritorio y la almacenará en el archivo mi_escritorio.gif en su directorio personal.

Un poco sobre los procesos.
El Arbol 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 inciados por los otros usarios;
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

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio