Comandos Unix para administrar sistemas

Hoy he descubiertos dos nuevos comandos para Unix bastante útiles a la hora de la administración de un sistema:

  • pstree -cpal: Muestra de forma jerárquica los procesos que tiene el sistema corriendo.
  • pstree -p 2323: Muestra la jerarquía de procesos a partir del proceso 2323.
  • lsof: (ls Open Files) Muestra los descriptores de fichero que tiene el sistema abiertos, ya sean descriptores de ficheros, o conexiones de red… que UNIX las trata también como descriptores de fichero.
  • watch -d: Ejecuta un comando cada X segundos, y muestra la diferencia de la salida por pantalla con respecto a la iteración anterior.

Más información: watch, lsof, pstree.

Importar datos de MySQL de latin1 a UTF8

Hoy me he topado con un pequeño incoveniente al intentar importar una base de datos que estaba en un equipo con MySQL 12.21, y la quería copiar a un equipo que tenía MySQL 14.12.
El problema residía en que la base de datos origen tenía un tipo de carácteres distintos (latin1) a la base de datos destino (UTF8).

La solución fue la siguiente:

mysql -uusername -p dbname --default-character-set=latin1 < bbdd_original.sql

Así conseguí que se exportaran los datos sin problemas de codificación de los carácteres.

Enlace

Comando find de Unix (GNU/Linux)

Existe un comando en sistemas Unix muy útil para poder encontrar ficheros con determinadas
características, es el comando find.

  • Para buscar los ficheros más grandes del sistema:
    find / -size +100000k -exec ls -lh '{}' ;
  • Para buscar los ficheros modificados recientemente (Último día):
    find / -mtime 0 -exec ls -lh '{}' ;
  • Para buscar los ficheros modificados recientemente (Último minuto):
    find / -mmin 0 -exec ls -lh '{}' ;

Para buscar ficheros de una fecha especifica, se puede intentar con lo siguiente:

$ ls -l | grep “`date ‘+%b %d’` 09:[1-5][0-9]“

que buscaría los ficheros modificados hoy entre las 9.00 y las 9.59… aunque seguro que hay alguna forma mejor de hacer esto. ¿A alguien se le ocurre?

Comprimir Ficheros en Linux

Hay varias formas de comprimir ficheros en Linux.

La que yo uso normalmente es la siguiente, ya que sirve tanto para comprimir ficheros, como directorios:

Ficheros .tar.gz

  • Comprimir: # tar -czf archivo.tar.gz ficheros
  • Descomprimir: # tar -xvzf archivo.tar.gz
  • Ver contenido: # tar -tzf archivo.tar.gz

Enviar ficheros comprimidos con netcat

Enviar un fichero entre dos máquinas:

$ netcat -l -p 5555 > salida.txt
$ netcat remote.host 5555 -q 0 < entrada.txt

Enviar un fichero comprimido entre dos máquinas:

$ nc -l -p 5555 | gunzip > salida.txt
$ cat entrada.txt | gzip | nc remote.host 5555 -q 0

Enviar un directorio comprimido entre dos máquinas:

$ netcat -l -p 3333 -v > backup.tgz
$ tar -czvpf - /path/to/files | netcat -q 0 remote.host 3333

Más info.

Calcular tiempo de ejecución de un comando en Bash Shell

El otro día estaba interesado en calcular el tiempo que tardaba en ejecutarse un comando, y esta es la forma que encontré de hacerlo:

#!/bin/bash
inicio_ns=`date +%s%N`
inicio=`date +%s`
sleep 5 # el comando
fin_ns=`date +%s%N`
fin=`date +%s`
let total_ns=$fin_ns-$inicio_ns
let total=$fin-$inicio
echo "ha tardado: -$total_ns- nanosegudos, -$total- segundos"

Como se puede comprobar, incluso se llega a tener una precisión de nanosegundos.

Fuente

Ejecución de aplicaciones remotas a través de SSH

Puede interesarnos ejecutar aplicaciones remotas en otras máquinas a través de SSH, y si ya lo planteamos como una tarea automática, más.

Aquí dejo un ejemplo de cómo se podría hace con SSH.

$ ssh -i /home/kardinal/.ssh/id_rsa_mon -l kardinal plan01.wnet "/aplicaciones/launcher/script.sh"

donde…

/home/kardinal/.ssh/id_rsa_mon es un fichero que contiene la clave pública del usuario.
kardinal es el usuario.
plan01.wnet es el host.
/aplicaciones/launcher/script.sh es la ruta de la aplicación en el host remoto.