Monthly Archives: June 2009

Unir Archivos de Video

Últimamente me encuentro que muchas películas que descargo vienen en dos cd’s (normalmente CD1 y CD2 o similar). Desde que uso DVD’s o el disco externo, es algo que no me gusta, así que las unía usando el software de Avidemux. Pero es un software gráfico que hace de unir vídeos un proceso casi artesanal.

Me he puesto a investigar cómo hacer para unir dos vídeos en la línea de comandos y hay una solución apoyada en cat y mencoder. El primero es standard de GNU/Linux, el segundo viene con el paquete MPlayer. Personalmente, la mejor opción de vídeo en GNU/Linux.

Para unir dos archivos de video hacemos:

$ cat video1.avi video2.avi > video_concatenado.avi
$ mencoder -ovc copy -oac copy -forceidx -o video_concatenado.avi video_final.avi

Pero ir haciendo esto vídeo a vídeo es también lento, muy parecido al proceso artesanal anterior, como ya sabemos de los ordenadores, si podemos hacerlo una vez, podemos hacerlo n veces, presento un pequeño script que resuelve este problema.

El principal tema a resolver era identificar el CD1 del CD2 pero pensándolo un poco, lo resolví.

El código fuente, como siempre, en pastie

Monitorización

Es una tarea básica de administración de sistemas, tener monitorizados los servicios que ofrecemos a los clientes. Existen muchas herramientas para esta tarea, más sofisticadas, una de mis favoritas es Cacti. Pero voy a comentar algunas herramientas de línea de comandos para monitorizar ficheros y la salida de comandos.

Para monitorizar un fichero, por ejemplo un log, podemos usar el comando tail -f o su versión en implantación en alto nivel tailf. El comando tail sin argumentos muestra las 10 últimas líneas de un fichero. tailf muestra siempre las 10 últimas líneas de un fichero y con cada nueva línea que se incorpora la va mostrando. Con el parámetro -n N mostramos N líneas.

La diferencia principal entre usar tail -f y tailf es que este último no accede al fichero mientras este no cambie. Esto significa que el tiempo de acceso no cambia, lo que se traduce en menos accesos al disco duro.

Si queremos controlar varios archivos en una sola consola, podemos usar multitail. Este comando dividirá la pantalla y mostrará en cada una de ellas la monitorización de un archivo, con una barra informativa de la última actualización. Este comando merece un post aparte.

¿Pero qué pasa si lo que queremos es monitorizar la salida de un comando? Podemos hacerlo de tres maneras.

La primera es colocar el comando en un tarea Cron, por ejemplo de 5 minutos, redirigir la salida a un archivo, y con tailf ir monitorizando los cambios. WTF!??

La segunda, es más artesanal, podemos hacer un script como este:

$ while true; do ; sleep TIME; done;

Es un poco más elegante, pero no deja de ser una chapuza. Hay que añadir que comando ejecutar y el intervalo de tiempo entre ejecuciones.

Pero es obvio que este problema es antiguo, así que alguien ya le ha dado solución y creó el comando watch. watch ejecuta un programa periódicamente y muestra la salida a pantalla completa. Que es lo que veníamos haciendo en las soluciones anteriores pero con simplemente.

watch comando

Lo cual no da pie a discusiones de cual es la mejor.

Algunos parámetros interesantes son:

  • -d –differences: Que muestra los cambios entre cada actualización.
  • -n –interval: El intervalo de tiempo entre actualizaciones, por defecto, 2 segundos.
  • -t –no-title: Ocultara la cabecera en la presentación de los datos.

En la página de manual, encontramos algunos ejemplos del uso:

  1. Detectar cambios en un directorio:
  2. watch -d ls -l
  3. Detectar cambios en un directorio hecho por joe:
  4. watch -d 'ls -l | fgrep joe'
  5. Controlar si tu administrador ha instalado el último kernel:
  6. watch uname -r

Seguimos observando la capacidad que tiene GNU/Linux para resolver problemas de muchas maneras y como las cuestiones más elementales se han ido incorporando a la larga lista de comandos.

El Comando Ping

Todo el mundo, desde el que tiene una pequeña LAN en su casa hasta el que es administrador de sistemas, ha usado alguna vez el comando ping. Pero este comando tiene más opciones aparte de teclear simplemente.

ping host

Veamos algunas de ellas

  1. -a: Se emite un beep por cada echo.
  2. -c N: Se envían N echo_request, por ejemplo para saber si está vivo un hosts con 1 suele valer.
  3. -i T: Intervalo en que se envía cada echo_request.
  4. -W T: Tiempo que se espera por una respuesta para considerarse válida.
  5. -n: No resuelve los nombres DNS asociados a la ip.
  6. -q: No muestra nada, sólo el encabezado y el resumen final, modo no verboso.

Por último, un pequeño script que se puede poner en alias para conocer si las máquinas de la LAN están vivas.

for HOST in $(seq INICIO FIN); do ping -c 1 -a $LAN_ADDRESS.$HOST; done;

INICIO y FIN representan la primera y última dirección de las máquinas de la LAN, LAN_ADDRESS es la dirección de red, las direcciones de mis máquinas críticas suelen ser consecutivas (al menos lo intento).

Para usarlo como alias abrimos en modo edición ~/.bashrc y escribimos en la parte de alias:

alias lanalive='for HOST in $(seq INICIO FIN); do ping -c 1 -a $LAN_ADDRESS.$HOST; done;'