Sei sulla pagina 1di 4

Algunos conceptos. En linux existen 3 archivos muy importantes y que generalmente pasan desapercibidos.

Estos se encuentran en /dev y son: stdin, stdout y stderr. STDIN: es el STandarD INput o entrada estandar, 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 parmetros podrs ver que toma cualquier caracter desde la entrada estandar (el teclado). Para cortar el proceso usa Control+C
# cat

Si ejecutas el comando cat /dev/mouse, al mover el mouse vers la aparicin de diversos caracteres basura. En este caso le indicamos al comando cat que nuestro stdin ser /dev/mouse. Lo mismo sucedera si quisieramos recibir informacin a travs del puerto serie COM1: cat /dev/ttyS0 En estos casos hemos hecho una redireccin cambiando la entrada estandar stdin por otra. Si bien los comandos funcionaron bien, para graficar correctamente este cambio los comandos deberan llevar el caracter de redireccin de entrada <
# cat < /dev/mouse # cat < /dev/ttyS0

STDOUT: es el STandarD OUTput o salida estandar, es el lugar en donde un proceso generalmente escribe su salida, por defecto, la pantalla. El archivo /dev/stdout es un archivo que apunta, tambin, a tu terminal/consola. Un comando ls enva por defecto la salida a la pantalla. Pero si agregamos el caracter de redireccin de salida > podemos enviarlo a cualquier otro lado. Por ejemplo, si quisieramos hacer un listado de archivos la carpeta /bin seguramente veramos pasar por pantalla muy rpidamente toda la lista de archivos y podramos leer solo la ltima parte (unas 20 lneas). Esto lo podramos solucionar enviando la salida estandar a un archivo y luego inspeccionar el archivo ms 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. Tambin notars que he redireccionado la salida estandar al archivo misalida.txt (en lugar de mostrarse en pantalla se guardar todo en un archivo) y luego redireccion la entrada estandar usando ese mismo archivo. STDERR: es el STandarD ERRor o error estandar, es el lugar en donde un proceso generalmente escribe los mensajes de errores, por defecto la pantalla.

Quizs se habrn 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. Imagnense ejecutar un comando que genera muchas lneas de salida y quizs muchos errores, que seramos 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 comn:
$ 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 deberamos redireccionar las salidas para leerlas con ms tranquilidad y en detalle:
$ tar cvf procs.tar /proc >detalle.txt 2>errores.txt

Con este comando direccionamos la salida estandar al archivo detalle.txt y los errores estandar al archivo errores.txt. Porqu hay un nmero 2 antes de > en el comando? Este nmero indica la salida: 0 = stdin, 1 = stdout, 2 = stderr. Si no colocara el nmero 2, los archivos detalle.txt y errores.txt contendran exactamente la misma informacin: slo la salida estandar, ya que los errores nunca se almacenaran. En humano el comando sera: 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 opcin a esta redireccin es:
$ tar cvf procs.tar /proc >procs.txt 2>&1

Este comando pone stdout en el archivo procs.txt as como tambin se envan los errores a &1 que es la salida estandar, o sea que tambin van a parar al archivo procs.txt. De esta manera tenemos stdout y stderr en un mismo archivo. > o >>? Cuando utilizamos un solo smbolo >, estamos indicando que se cree un archivo que contendr la salida estandar. Si el archivo existe, se sobreescribir.

Si queremos agregar a ese archivo basta con indicar dos caracteres >> (cuando el archivo destino no exista lo crear). En una depuracin de comandos es bueno realizar el agregado con >>, de lo contrario perderamos la primer informacin:
$ 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 quedarn 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 caracter | . Uno de los usos ms comunes es pausar un listado muy largo para analizar en detalle:
$ cat archivo.txt | more

La salida de cat es la salida estandar (pantalla), pero al utilizar el pipe esa salida la entubamos hacia la entrada del comando more. Otro ejemplo sera redireccionando varios comandos:
$ ps ax | grep ssh | grep -v grep

Aqu realizamos un ps ax que nos mostrara la lista completa de procesos, al filtrar con grep ssh solo nos mostrara aquellas lneas que contengan la palabra ssh, pero como el mismo comando grep ssh aparece y no nos interesa, volvemos a filtrar con grep quitando las lneas que contengan la palabra grep (grep -v grep). Un ejemplo muy til para matar todas las instancias de ssh sera 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 lnea de lo que est dentro de las comillas ` ` y luego hace un kill -9 de cada resultado. Fjense 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 dara una lista de PIDs de cada instancia de sshd. Al estar dentro del bucle for, procesaramos cada pid con el comando kill.

Para no tener que recordar todo este comando podramos crear un script y usar variables para pasar la bsqueda de procesos:
$ cat mataprocesos #!/bin/bash #$1 es el primer valor que toma de lnea 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 ejecucin y si queremos le hacemos un link simblico dentro de /usr/bin para que sea accesible desde cualquier punto. NOTA: si bien existe el comando pkill (que mata procesos respecto del nombre pasado) me pareci un buen ejercicio para ver las redirecciones.

Potrebbero piacerti anche