Laboratorio de Ingeniería de Datos: Estabilización de la Brecha
1. Objetivo y Escenario
Gestionar los flujos de datos ($stdin$, $stdout$, $stderr$) de los sensores de materia oscura para identificar la frecuencia de resonancia de Tierra-2.
Fase 1: Captura de Frecuencias (Redirección Básica)
Necesitamos documentar las fluctuaciones de energía. No podemos permitir que los datos se pierdan en la terminal como lágrimas en la lluvia.
-
Crea un archivo llamado
frecuencias.txtque contenga la cadena “Frecuencia Inicial: 52Hz” usando el descriptor de salida estándar. -
Añade (sin sobrescribir, no seas descuidado) la frecuencia “Frecuencia Secundaria: 8.5MHz” al mismo archivo.
-
Verifica el contenido usando el operador de entrada para que el comando
catlea directamente del archivo.
Fase 2: Filtrado de Ruido (Errores y /dev/null)
El equipo de Cisco dejó unos scripts de monitoreo que lanzan errores constantes porque no detectan sus juguetes de Tierra-1. Es molesto.
-
Ejecuta un comando que intente acceder a un directorio inexistente (ej.
ls /root/secretos_zoom). -
Redirige ese error a un archivo llamado
logs_error.txtpara que no ensucie mi pantalla. -
Ahora, haz lo mismo pero manda el error al “vacío” ($/dev/null$). No quiero volver a saber de esa falla.
Fase 3: La Tubería de Datos (Pipes |)
Aquí es donde se separa a los científicos de los aficionados. Necesito que extraigas solo la información crítica de un flujo masivo.
-
Utiliza el comando
catpara leer tus apuntes o cualquier archivo de texto largo, y conéctalo mediante un Pipe al comandogreppara buscar la palabra “descriptor”. -
Sincronización: Explícame (o demuéstralo con un comando) qué sucedería si el segundo comando de tu tubería falla. ¿Qué señal enviaría el kernel al primero? Si respondes mal, tú limpiarás las jaulas de las muestras biológicas.
Fase 4: Consolidación Multiversal (2>&1)
A veces necesito ver los resultados y los errores en un solo reporte para compararlos con los datos de Jesse en Tierra-2.
- Escribe un comando que mande tanto la salida normal como los errores al archivo
reporte_final.txtutilizando una sola línea de comando. Recuerda el orden de los descriptores; la lógica es secuencial, no me hagas perder el tiempo con errores de sintaxis básicos.
💻 2. Ejecución (Comandos/Código)
Fase 1
echo "Frecuencia Inicial: 52Hz" > frecuencias.txt
echo "Frecuencia Secundaria: 8.5MHz" >> frecuencias.txt
cat frecuencias.txt
Fase 2
ls /root/secretos_zoom 2> logs_error.txt
cat logs_error.txt
ls /root/secretos_zoom 2> /dev/null
Fase 3
cat texto_grande.txt | grep "descriptor"
cat texto_grande.txt | sleep 60
Que paso? cat lleno el buffer, como el comando sleep 60 se nego a recojer lo que estaba en el buffer y el buffer se lleno, entonces el resto simplemente fue descartado, el kernel vio que un lado de la tuberia estaba rota y mando la señal SIGPIPE.
Fase 4
ls -R / > reporte_final.txt 2>&1
📸 3. Evidencia (Output)
Fase 1
echo "Frecuencia Inicial: 52Hz" > frecuencias.txt
cat frecuencias.txt
Frecuencia Inicial: 52Hz
echo "Frecuencia Secundaria: 8.5MHz" >> frecuencias.txt
cat frecuencias.txt
Frecuencia Inicial: 52Hz
Frecuencia Secundaria: 8.5MHz
Fase 2
ls /root/secretos_zoom 2> logs_error.txt
cat logs_error.txt
ls: no se puede acceder a '/root/secretos_zoom': Permiso denegado
ls /root/secretos_zoom 2> /dev/null
Fase 3
cat texto_grande.txt | grep "descriptor"
En Unix/Linux **todos los recursos exponen la misma interfaz** (open, read, write, close via descriptores). Los descriptores de archivos son indices enteros positivos en una tabla llamada `File Descriptor Table` que lo tiene el kernel y el indice apunta a otra tabla llamada `System-wide Open File Table` que a su vez apunta a un archivo abierto (recursos de entradas y salidas) de un proceso, cada proceso tiene su propio conjunto de descriptores.
Por defecto se reservan los 3 primeros descriptores (0, 1 y 2), donde:
Los operadores de Redirección están muy ligados a los descriptores de archivos.
| `2>&1` | Salida de error -> Salida | Este significa mandar la salida de error hacia donde está la salida normal, <br />básicamente en el ejemplo dice mandar la salida a `hola.txt` y mandar el error al mismo lugar al que mandas la salida normal (`stdout`). Es decir, con `echo` mandas "Hola" al `stdout`, y luego con `>` le dices que el `stdout` lo mande al archivo `hola.txt` y luego le dices que el `stderr` lo mandes a `stdout`, y `stdout` está en `hola.txt` así que se manda el error también al archivo `hola.txt`.<br />Ojo: el `&` indica que el siguiente argumento debe interpretarse como un **descriptor de archivo** y no como un **nombre de archivo**.<br />Por que del orden:<br />las redirecciones se leen de izquierda a derecha, es decir en el ejemplo dejamos primero el `stdout` apuntando a hola.txt y luego le decimos que el error tembien apunte...<br />en un orden distinto como ejemplo `echo "Hola" 2>&1 hola.txt` con esto apuntas el `stderr` hacia donde apunta el `stdout`, y si te fijas el stdout nunca cambio hacia donde apunta, por lo que no se ira a `hola.txt` | `echo "Hola" > hola.txt 2>&1` |
15970 -r--r--r-- 1 root root 65K mar 10 19:08 descriptors
18396 -r--r--r-- 1 root root 65K mar 10 19:08 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 10 19:08 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 10 19:08 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
15970 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18396 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
18743 -r--r--r-- 1 root root 4,0K mar 11 00:02 report_descriptor
15497 -r--r--r-- 1 root root 65K mar 11 00:02 descriptors
15215 -rw-r--r-- 1 root root 4,0K mar 11 00:02 initial_descriptor_timeout
142176 -rw-r--r-- 1 root root 4,0K dic 30 15:37 dell-wmi-descriptor.ko.xz
148893 -rw-r--r-- 1 root root 4,0K feb 8 03:58 dell-wmi-descriptor.ko.xz
395596 -rw-r--r-- 1 root root 3,1K mar 1 18:20 vnd.sun.j2me.app-descriptor.xml
cat texto_grande.txt | sleep 60
Fase 4
ls -R / > reporte_final.txt 2>&1
4. Lección Aprendida
que el comando sleep significa dormir, y sleep 60 es dormir por 60 seg.