Comandos útiles de Linux

Abro este tema para ir recopilando comandos que pueden ser de utilidad cuando trabajamos con una distribución Linux desde linea de comandos.

Comienzo por algunos comandos para poder consultar la versión y más información sobre el sistema operativo (alguno es específico para CentOS o RedHat):

> uname -a > uname -l > cat /proc/version > cat /etc/redhat-release

 

Una manera sencilla de comprobar si el puerto de un servidor o PC está abierto para la máquina desde la que queremos acceder es utilizando telnet (no sólo linux, también funciona en Windows). Por ejemplo, con telnet comprobamos que:

 

El puerto 1433 está abierto en la ip 192.168.0.107

$ telnet 192.168.0.107 1433 Trying 192.168.0.107... Connected to 192.168.0.107.

 

El puerto 1491 está cerrado en el dominio dataprix.tv

$ telnet dataprix.tv 1491 Trying 188.165.232.198... telnet: connect to address 188.165.232.198: Connection refused telnet: Unable to connect to remote host

 

Cosillas relacionadas con bash script:  

  • Una vez editado el script con vim otorgamos permisos de ejecución con
> chmod +x [nombrefichero.sh]
  • Comprobar el progreso en la ejecución de un script en lugar de llamarlo directamente: 
> bash -x [nombrefichero.sh]

 

 

¿Tienes problemas de espacio en disco? ¿Te has colado copiando un backup sobre la partición raíz, la has llenado, y no sabes dónde está el fichero que hay que eliminar para que todo vuelva a funcionar? (Basado en hechos reales ;))

Comandos para comprobar el espacio ocupado y disponible de cada partición:

> df -h
> df -k

Comandos find para encontrar los ficheros grandes, con un tamaño mayor del que se especifique, en este caso 1Gb:

> find / -type f -size +10000000k
> find / -type f -size +1000M | sort -rn -k5

Comando find para encontrar en el directorio temporal los últimos ficheros modificados, concretamente en los últimos 15 minutos:

> find /tmp -mmin -15 -type f

Y ya que estamos con el find, una opción muy útil es la -name para buscar un archivo por nombre, o parte del nombre:

> find / -name "*nombreFichero*"

Otro comando de Linux muy útil para averiguar cuánto espacio ocupan los ficheros de cada directorio es du. Si se utiliza con la opción --max-depth=1 se puede consultar el espacio ocupado por cada directorio a partir del directorio actual. Más información sobre el comando du en www.linfo.org/du.html

> du --max-depth=1

o también

> du -sh *

 

En respuesta a por Carlos

Y después de encontrar lo que ocupa demasiado espacio, para eliminar todos los ficheros y directorios que no necesitas se puede utilizar el comando rm con borrado recursivo con la opción -r, y con la opción -f si son muchos ficheros y no queremos que nos pida confirmación para cada uno:

> rm -rf *

Mucho cuidado con este comando, borra todo lo que hay a partir del directorio actual.

Para evitar errores por no tener bien presente cuál es el directorio actual, mejor usarlo especificando al menos el directorio inicial desde el que se quiere eliminar todo:

> rm -rf borratododentrodeestedirectorio/*

Muchas veces el problema puede aparecer por ficheros de log que han crecido demasiado, porque no está bien definida la rotación de logs con rotatelog, por ejemplo, o porque algún problema hace que se registren demasiados log de errores en muy poco tiempo.

Aparte buscar la causa del problema, la medida que puede devolver tu servidor a la vida es vaciar algunos de los logs.

Los logs principales suelen estar en /var/log. Entonces, para examinar, por ejemplo los últimos (y más recientes) registros del sys log podemos hacer

> sudo tail -f /var/log/syslog

Y para truncarlo si es necesario:

> sudo tee /var/log/syslog </dev/null

 

Tienes discos en RAID? Quieres sabes el estado del RAID, o cómo está organizado?

Lo primero es pedir información sobre los discos y el estado de las particiones con fdisk:

> fdisk -l

Después, si tienes instalado MDADM, consultar la configuración y el estado del RAID para cada particion. Si, por ejemplo, las particiones son /dev/md1 y /dev/md2:

> mdadm --misc --detail /dev/md1
> mdadm --misc --detail /dev/md2

 

Una de las acciones más comunes en linea de comandos linux es tener que comprimir o descomprimir ficheros, para hacer backups, instalaciones etc. Los ficheros de linux normalmente se comprimen en un fichero con formato tar.gz, conocido como tarball, o 'tarpelota', y es fácil descomprimirlos, pero yo nunca me acuerdo de las opciones, así que aquí las dejo:

Comprimir ficheros en un archivo tar.gz:

$ tar czvf archivo.tar.gz fichero1 fichero2 fichero3

Comprimir ficheros de un directorio en un archivo tar.gz:

$ tar czvf archivo.tar.gz directorio/

Descomprimir los ficheros del tarball en el directorio actual:

$ tar xzvf archivo.tar.gz

Consultar los ficheros que hay comprimidos en una tarpelota:

$ tar tzf archivo.tar.gz

Descomprimir uno de los ficheros del tarball en el directorio actual:

$ tar xzvf archivo.tar.gz fichero2

 

Si después de restaurar un backup, por ejemplo, nos damos cuenta de que el usuario y grupo de los ficheros es el del servidor donde teníamos el backup, y necesitamos asignar a estos ficheros el usuario y grupo correctos podemos situarnos en el directorio desde el que queramos cambiar los owners de todos los directorios y ficheros, y utilizar un CHOWN recursivo de esta manera:

# chown -R usuario:grupo *

O mejor, para evitar problemas si nos equivocáramos al situarnos en el directorio, hacerlo a partir del directorio inicial que queramos cambiar:

# chown -R usuario:grupo directorio

Este comando no cambia los owners de los ficheros ocultos o de sistema, así que, si por ejemplo tenemos ficheros .htacces, combinando find y chown se pueden modificar los usuarios y propietarios de todos los .htaccess a partir del directorio donde se esté ubicado:

# find . -name .htaccess -exec chown usuario.grupo {} \;

En todos los ejemplos 'usuario' es el nombre del usuario, y 'grupo' es el nombre del grupo al que quedarán asignados los directorios y ficheros.

 

Otro comando muy útil para copiar directorios completos, traspasar backups y mantener carpetas sincronizadas es rsync. Ejemplo de utilización de rsync para copiar todo el contenido de una carpeta a otra:

> rsync -av /directorioorigen/carpeta/* /directoriodestino/carpeta

 

Ejecutar procesos en background

Para ejecutar procesos en background, tan sólo hay que añadir & al final del comando, y se puede seguir utilizando la consola mientras el proceso o el script  lanzado se ejecuta en background, pero si, por ejemplo, estamos conectados con Putty, el proceso termina igualmente cuando se cierra la sesión de Putty o este queda inactivo.

Lanzar procesos en background que no terminen al cerrar la sesión

Para evitar que el prceso termine al cerrar la sesión se puede utilizar el comando 'disown', que desvincula el proceso de nuestra sesión. Por ejemplo, si quiero lanzar un script de Python y dejarlo corriendo:

$ python MiScript &
[1] 29840
$ jobs
[1]+  Running                 python MiScript &
$ disown

(Con jobs vemos todos los procesos que tenemos en background. Después de ejecutar disown ya no veremos el último job, pero se seguira ejecutando. Para desvincular todos los jobs activos de la shell en la que se está trabajando se puede utilizar > disown -r)

 

Otra manera de hacerlo con un sólo comando es utilizando nohup (recomendable además enviar la salida standar a /dev/null para que no se cree un fichero nohup.out):

$ nohup python MiScript &>/dev/null &