jul 13 2010

Comando perror para obtener descripción

Category: MysqlDavid González @ 10:58

Muchas veces, mysql nos devuelve un error numérico que a primera vista no nos dice nada y no aporta ninguna información.

Por ejemplo, estamos haciendo un mysqldump de una base de datos y muestra este error:

root@tureceta [~]# mysqldump tureceta_blog > tureceta_blog.sql
mysqldump: Got error: 29: File './tureceta_blog/test.MYD' not found (Errcode: 24) when using LOCK TABLES
root@tureceta [~]#perror 29
OS error code  29:  Illegal seek

O ya nos ha pasado alguna vez este error y recordamos cual era el problema o no nos dice nada.

Para obtener más información podemos hacer uso del comando perror que nos facilita una descripción del error. Con esta información ya podemos investigar un poco más y encontrar la solución.

root@tureceta [~]# perror 24
OS error code  24:  Too many open files

root@tureceta [~]# perror 29
OS error code  29:  Illegal seek

En concreto, vimos la solución a este error el otro día.

Entradas relacionadas

Etiquetas: , ,


jul 05 2010

Eliminar fichero que empieza con un guion -

Category: LinuxDavid González @ 21:45

Vamos a ver la receta, para los casos en los que tenemos un archivo que empieza con un guion “-” y no podemos eliminarlo de la forma habitual, ya que desde consola, interpreta el guión como si fuéramos a pasarle alguna opción al propio comando.

dgonzalez@David:~/carpeta$ rm -f -fichero
rm: opción inválida -- c
Pruebe `rm --help' para más información.

En este caso, como existen las opciones “rm -fi” intenta ejecutar ese comando, mostrando error en la opción -c que no existe con el comando rm.

En primera instancia, se me ocurrieron varias maneras de eliminarlo. Con comillas en el fichero, intentando escaparrar el guión, pero no funcionaron.

dgonzalez@David:~/carpeta$ rm "-fichero"
rm: opción inválida -- c
Pruebe `rm --help' para más información.

dgonzalez@David:~/carpeta$ rm \-fichero
rm: opción inválida -- c
Pruebe `rm --help' para más información.

La solución que encontré es bien sencilla, especificar que estas en esta ruta con ./

rm  ./-fichero

Otra manera más pro, es eliminar ficheros por su número de Inodo vía rm-rf.es

Entradas relacionadas

Etiquetas: ,


abr 01 2010

Copiar un archivo en todos los directorios con find

Category: LinuxDavid González @ 8:10

Ya vimos en otro post el uso del find y algunas de sus opciones.

La receta de hoy sirve para copiar un fichero en todos los directorios o carpetas de un site. Vamos a ver como sería:

find ruta -type d -exec cp -p fichero {} \;

Cuando he tenido que usar esta comando, principalmente, es en los casos en que he creado un php.ini en el public_html con una directiva. Como el php.ini sólo lo activa a nivel de directorio, es necesario tener uno en cada una de las carpetas donde también requerimos dicha directiva activa.

Esta directiva podría ser, por ejemplo:

register_globals=On;
memory_limit = 32M;
max_execution_time = 30
post_max_size = 8M;
include_path = ".:/home/tureceta/php";
upload_max_filesize = 2M;

De esta forma, copiaremos el fichero php.ini en todas la carpetas o directorios de nuestro alojamiento.

Estando en la home (/home/tureceta/public_html), usaremos el comando:

find . -type d -exec cp -p php.ini {} \;

Entradas relacionadas

Etiquetas: , , ,


mar 29 2010

Convertir de ISO-8859 a utf-8

Category: LinuxDavid González @ 8:00

A más de uno le habrá dado mucho trabajo la codificación de caracteres, cuando no muestra bien las ñ, acentos, etc…

Hoy vamos a dar la receta, para convertir estos archivos fácilmente y poder cambiar la codificación. Para ellos usaremos el comando iconv

  • iconv. Convierte la codificación de los ficheros dados de una codificación a otra.
  1. Modo de empleo:
  2. iconv [OPCIÓN...] [FICHERO...]

  3. Opciones o parámetros:
  4. Especificación de formato de Entrada/Salida:
    -f, –from-code=NOMBRE     codificación del texto original
    -t, –to-code=NOMBRE       codificación para el resultado

    Información:
    -l, –list                 lista todos los juegos de caracteres conocidos

    Control del resultado:
    -c                         se omiten los caracteres inválidos en la salida
    -o, –output=FILE          fichero de salida
    -s, –silent               suprime los avisos
    –verbose              muestra información sobre el desarrollo

    -?, –help                 Da esta lista de ayuda
    –usage                Da un mensaje corto de uso
    -V, –version              Muestra la versión del programa

    Los argumentos obligatorios u opcionales para las opciones largas son
    también obligatorios u opcionales para las opciones cortas correspondientes.

  5. Ejemplos:

Convertir un fichero de  ISO-8859-1 a UTF8

iconv --from-code=ISO-8859-1 --to-code=UTF-8 iso.txt > utf.txt

Convertir un fichero de ISO-8859-15 a UTF8

iconv --from-code=ISO-8859-15 --to-code=UTF-8 iso.txt > utf.txt

Gracias Juan ;)

Entradas relacionadas

Etiquetas: ,


mar 25 2010

Comandos en linux para buscar ficheros y carpetas

Category: LinuxDavid González @ 23:50

Vamos a ver algunos de los comandos que nos pueden resultar útiles cuando queremos buscar un archivo y/o carpetas en linux, desde consola.

  • locate
locate archivo.php

Este comando buscar en una “especie de base de datos” donde tiene la ruta de los fichero y así resulta mucho más rápido encontrar los ficheros o carpetas que si se tiene que recorrer toda la estructura de directorios.

Hay que tener en cuenta que la “base de datos” del locate puede estar obsoleta. Para actualizarla debemos usar este comando (lo pondré en segundo plano con “&” porque le puede costar en ejecutarse).

updatedb &
  • find

El comando find sirve para buscar ficheros y directorios pero es muy complejo y tiene muchas opciones, de las cuales sólo explicare algunas.

La ruta de acceso por defecto es el directorio actual (representado con un “. “)  y la expresión por defecto es -print. A la hora de buscar, puedes especificar muchos parámetros:

  1. el nombre (-name xxx)
  2. find . -name tureceta*
  3. Si es un archivo o carpeta (-type f -type d)
  4. find . -type f -name tureceta*
    find . -type d -name tureceta*
  5. Los permisos que tiene (-perm nnn)
  6. find . -type d -perm 777
  7. El usuario al que pertenece (-user usuario1)
  8. find . -type f -user usuario1
  9. El grupo al que pertenece (-group grupo1)
  10. find . -type f -group grupo1
  11. Si el fichero está vacio (-empty)
  12. find . -type f -empty
  13. El tamaño (-size n[cwbkMG]) siendo
    ‘b’    para bloques de 512-byte (este es el de por defecto)
    ‘c’    para bytes
    ‘w’   para two-byte words
    ‘k’    para Kilobytes (1024 bytes)
    ‘M’   para Megabytes (1048576 bytes)
    ‘G’    para Gigabytes (1073741824 bytes)

    find . -size 21k
  14. Modificados los datos en las últimas X*24h (- dtime n)
  15. find . -tipe f -dtime 2  (en las últimas 48h = 2*24)
  16. Accedidos en las últimas X*24h (- atime n)
  17. find . -tipe f -atime 2  (en las últimas 48h = 2*24)

Recordar que con la ayuda y con el man del comando tendréis toda la información

find --help
man find
  • whereis
  • Buscar la localización de un fichero binario, fuente o man

    [root@server ~]# whereis grep
    grep: /bin/grep /usr/share/man/man1/grep.1.gz /usr/share/man/man1p/grep.1p.gz
  • which
  • Buscar la localización de un fichero binario o ejecutable

    [root@sever ~]# which grep
    /bin/grep
    

Entradas relacionadas

Etiquetas: , , , ,


mar 24 2010

Comandos para saber el hardware desde Linux

Category: LinuxDavid González @ 1:27

Vamos a ver algunos comandos para saber el tipo de hardware que tenemos instalado en nuestro servidor o pc.

En la carpeta /proc, tenemos varios archivos que poseen información sobre la cpu, memoria, etc… Estos son algunos ejemplos:

  • Información de la/s cpu’s (sólo pego el resultado de la 1ª cpu)
root@server [~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 26
model name      : Intel(R) Xeon(R) CPU           E5504  @ 2.00GHz
stepping        : 5
cpu MHz         : 2000.117
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx rdtscp lm constant_tsc nonstop_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
bogomips        : 4000.23
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual
power management: [8]
  • Información de la memoria Ram
root@server [~]# cat /proc/meminfo
MemTotal:     16433556 kB
MemFree:      11701760 kB
Buffers:        270512 kB
Cached:        4016800 kB
SwapCached:          0 kB
Active:        2084428 kB
Inactive:      2389568 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     16433556 kB
LowFree:      11701760 kB
SwapTotal:     2096472 kB
SwapFree:      2096472 kB
Dirty:            2588 kB
Writeback:           0 kB
AnonPages:      186604 kB
Mapped:          18080 kB
Slab:           219132 kB
PageTables:       9452 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  10313248 kB
Committed_AS:   530848 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    265212 kB
VmallocChunk: 34359471743 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB
  • Información de la memoria swap:
root@server [~]# cat /proc/swaps
Filename                Type        Size    Used    Priority
/dev/cciss/c0d0p3                       partition    2096472    0    -1
  • Información a cerca del kernel, versión de linux:
root@server [~]# cat /proc/version
Linux version 2.6.18-164.11.1.el5 (mockbuild@builder10.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Wed Jan 20 07:32:21 EST 2010
  • Información de la carga del servidor (loadaverage)
root@server [~]# cat /proc/loadavg
0.04 0.08 0.08 1/169 29297

Si queréis podéis echar un vistazo a estos ficheros ya que exiten más y con mucha información.

A parte de estos ficheros ubicados en /proc, disponemos de comandos que también tienen mucha información de nuestro hardware.

  • Comando lshal (saca información del modelo de servidor, versión del firmware, serial del server, versión de la Bios, versión del kernel, todo tipo de información del procesador, información de los discos, puntos de montaje, particiones, así como de los usb, pci y un largo etcetera… Sólo mostraré algunos ejemplos)
root@server [~]#  lshal | more

system.product = 'ProLiant DL360 G6'  (string)

system.firmware.release_date = '07/24/2009'  (string)

smbios.system.serial = 'CZJ9XXXXXXX'  (string)

smbios.bios.version = 'P64'  (string)
system.kernel.version = '2.6.18-164.11.1.el5'  (string)info.product = 'Intel(R) Xeon(R) CPU           E5504  @ 2.00GHz'  (string)

volume.is_mounted_read_only = false  (bool)
volume.is_mounted = true  (bool)
volume.mount_point = '/'  (string)
volume.label = '/'  (string)

volume.size = 70038259200  (0x104e9b0600)  (uint64)
volume.num_blocks = 136793475  (0x8274d83)  (int)
volume.block_size = 512  (0x200)  (int)
  • Comando lshw (muestra información del sistema, discos, memorias, pci, usb… sería como ls del hardware. Sólo voy a poner algunos ejemplos de la salida). Podemos usar el parámetro “-sort” para ordenar y “-html > archivo.html” para exportarlo a este tipo de fichero.
root@server [~]# lshw

*-memory
description: System Memory
physical id: 1b
slot: System board or motherboard
size: 1GiB

*-pci

*-display:0 UNCLAIMED
description: VGA compatible controller
product: RV410 [Radeon X700]
  • Comando lspci (lista los dispositivos pci. Sería como un ls de pci)
root@server [~]# lspci

02:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
  • Comando lsusb (lista los dispositivos usb. Listaría los puertos usb)
root@server [~]# lsusb

Bus 005 Device 002: ID 05e3:0760 Genesys Logic, Inc. USB 2.0 Card Reader/Writer

Entradas relacionadas

Etiquetas: , ,


mar 21 2010

Tareas automáticas con cron

Category: LinuxDavid González @ 22:39

Vamos a dar la receta para usar el comando cron y poder sacarle partido a las tareas automáticas.

Cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta procesos a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el fichero crontab.

Cron se podría definir como el “equivalente” a Tareas Programadas de Windows.

yum install vixie-cron.i386
  • Comandos de Cron:

crontab [-u usuario] [ -e | -l | -r ]

-e (editar el crontab)
-l (listar los cron)
-r (borrar los cron configurados)
-i (pregunta antes de borrar los cron configurados)
-s (selinux context)

Por ejemplo, si queremos listar los cron que tiene el usuario ususario1:

crontab -u usuario1 -l

Si tenemos creado el fichero cron, podemos añadirlo al usuario de este modo crontab [-u user] file

crontab -u usuario1 /home/usuario1/cron

Si no especificamos el usuario con la opción -u, estaremos editando los cron de root

  • Restringir el uso del comando cron:

Es posible permitir o denegar a los usuarios la creación de estas tareas. Para ello hay que editar el fichero cron.allow (para permitir) y cron.deny (para denegar).

Simplemente, habría que poner los usarios uno en cada línea. Suelen estar estos ficheros en /etc/

  • Fichero crontab

Al editar el cron de un usuario, con la opción “-e” nos abrirá el editor definido en la variable de entorno. Si queremos cambiar el editor por defecto, debemos especificarlo en .bashrc de tu usuario o de root, con estas líneas:

export VISUAL="vim"
export EDITOR="vim"

No hay que olvidarse de recargar el bashrc:

source ~/.bashrc

En el fichero crontab, podemos especificar algunas variables como son:

SHELL -  indica el entorno ‘shell’ en la que se ejecuta el cron
PATH – especifica la/s ruta/s donde buscará los binarios a ejecutar
MAILTO -  cuenta de email, donde se mandará un correo al finalizar la tarea
HOME – directorio raiz que tomara el cron

Por ejemplo:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

Su sintaxis, es muy sencilla. Esta compuesto de 5 dígitos o asteríscos “*” separados por espacio y el comando a ejecutar.

##########################################################
#minuto (0-59),                                          #
#|  hora (0-23),                                         #
#|  |  día del mes (1-31),                               #
#|  |  |  mes (1-12),                                    #
#|  |  |  |  día de la semana (0-6 donde 0=Domingo)      #
#|  |  |  |  |       comandos                            #
##########################################################
15 02  *  *  *  /script/actualiza.sh

Hay que puntualizar, que se pueden poner varios valores en un mismo ‘campo’ de esta forma:

Se ejecutaría el comando who todas las horas, en los minutos 2, 10, 20 y 45

2,10,20,45 * * *  * /usr/bin/who

También es posible usar “/x” en los minutos, horas, días para indicar un intervalo, cada x minutos, cada x horas, cada x diás.

Ejecutar el comando who cada 5 minutos:

*/5 * * * * /usr/bin/who

Para evitar que nos mande el email una vez haya completado la tarea, podemos redirigir la salida de este modo.

Cada dos horas, borrar los ficheros temporal*:

* */2 * * * rm -f /home/usuario1/tmp/temporal*  > /dev/null 2>&1

Si nos resulta útil, también podemos redirigir la salida a un fichero de texto de este modo, a modo de log:

Todos los días a las 5:00, listaría los ficheros de la carpeta /home/usuario1/tmp/

0 5 * * * ls -las /home/usuario1/tmp/  >> /home/usuario1/cron.txt

Es muy importante poner dos “>>” para que cada vez escriba al final del archivo, ya que de poner sólo uno “>”, cada vez que se ejecute nos macharía la salida anterior. También hay que tener en cuenta la salida del cron ya que de ser muy grande, podemos crear un log de mucho tamaño.

Por último, recordar que el signo # sirve para comentar, tanto una linea que no queremos que se ejecute, como algún comentario que hayamos puesto.

Por si sirve de ayuda, aquí tenéis un generador.

Entradas relacionadas

Etiquetas: ,


mar 20 2010

Comandos de exim

Category: EximDavid González @ 18:33

La receta de hoy será sobre Exim. Vamos a ver algunos de los comandos y opciones que tiene.

Exim (EXperimental Internet Mailer) es un agente de transporte de correo (MTA)  y puede ser utilizado en la mayoría de los sistemas Unix (entre ellos GNU/Linux).

El paquete exim contiene exim, exim_dumpdb, exim_fixdb, exim_tidydb, exinext, exiwhat, exim_dbmbuild, exicyclog, exigrep, eximstats, exiqsumm, exim_lock y exim_checkaccess.

La mayoría son scripts hechos en perl, que nos harán las vida más fácil. En otro post, ya hablaremos más a fondo sobre ellos.

  • exiwhat -  lista los procesos de exim están corriendo
  • exiqgrep -  muy útil para hacer un grep de la cola de correo
  • exiqsumm -  hace un sumatorio de los correos que tiene en cola
  • exigrep -  buscar en el log de exim
  • exipick -  seleccionar un mensaje con varios criterios
  • exicyclog -  rota los logs del propio exim
  • eximstats -  obtiene estadísticas a partir de los logs de exim
  • exim_checkaccess -  chequea si una dirección de correo destino con su correspondiente IP, es accesible
  • exim_dbmbuild -  construye un fichero DBM
  • exinext -  consulta los tiempo de respuesta del destino
  • exim_dumpdb -  escribe en la salida estandar los datos de la base de datos de exim
  • exim_tidydb -  eliminar entradas antiguas de la base de datos de exim
  • exim_fixdb -  modifica los datos de la base de datos de exim
  • exim_lock -  bloquea un fichero mailbox

Exim tiene muchos parametros, yo voy a destacar los siguientes:

Muestra un contador con  el número total de correos en cola:

exim -bpc

Muetra todos los correos en cola:

exim -bp

Mostrar el contenido de un mensaje:

exim -Mvb <IDmensaje>

Muestra la cabecera de un mensaje:

exim -Mvh <IDmensaje>

Forzar la salida de todos los mensajes de la cola de correo:

exim -qff

Forzar la salida de un mensaje en concreto:

exim -M <IDmensaje>

Borrar un correo de la cola:

exim -Mrm <IDmensaje>

Nos permite ver lo que ha sucedido con este mensaje (lo mismo que buscar en el log por IDmensaje):

exim -Mvl <IDmensaje>

Hacer un tracert hacia una dirección de correo:

exim -bt <email@destino.com>

Muetra por pantalla un resumen de los correos que hay en cola (contador, peso, tiempo en cola del más nuevo y el más viejo, dominio):

exim -bp | exiqsumm

Concatenando estos comandos de exim y otros, podemos hacer “lineas” realmente interesantes, algunas de ellas se pueden covertir en scripts muy útiles.

Eliminar todos los mensajes de más de X tiempo. En nuestro ejemplo 3 días (86400 * 3 = 259200):

exiqgrep -o 259200 -i | xargs exim -Mrm

Eliminar los correos de una determinada cuenta de correo:

exim -bp | grep "<direccion@destino.com>" | awk '{print $3}' | xargs exim -Mrm

Forzar los correos de una determinada cuenta de correo:

exim -bp | grep "<direccion@destino.com>" | awk '{print $3}' | xargs exim -M

Como podéis ver, se le puede sacar mucho partido a exim sabiendo estos comandos.

Entradas relacionadas

Etiquetas: ,


mar 17 2010

Comprimir y Descomprimir ficheros en Linux

Category: LinuxDavid González @ 18:06

La receta de hoy es para saber, dependiendo del tipo de fichero, el comando para poder descomprimir un archivo en linux desde consola. En primer lugar, lo que deberíamos hacer es utilizar el comandofile” al fichero para ver el tipo de archivo.

La manera de usarlo sería:

$ file fichero.tar.gz
fichero.tar.gz: gzip compressed data, from Unix, last modified: Fri Aug 17 04:42:00 2007

Una vez identificado el tipo de fichero, vamos a ver los comandos básicos para comprimir y descomprimir.

TAR - POSIX tar archive (GNU)

  • Comprimir
tar -cvf ficheros.tar carpeta/ficheros*
  • Descomprimir
tar -xvf ficheros.tar
  • Ver contenido
tar -tvf ficheros.tar

TAR.GZ – gzip compressed data

  • Comprimir
tar -czvf ficheros.tar carpeta/ficheros*
  • Descomprimir
tar -xzvf archivos.tar.gz
  • Ver contenido
tar -tzvf archivos.tar.gz

GZ – gzip compressed data

  • Comprimir (creará un fichero llamado archivo.gz)
gzip archivo
  • Descomprimir
gzip -d archivo.gz
  • Ver contenido
gzip -l archivo.gz

ZIP – Zip archive data

  • Comprimir
zip archivos.zip carpeta/archivos*
  • Descomprimir
unzip  archivos.zip
  • Ver contenido
unzip -v archivos.zip

RAR – RAR archive data

  • Comprimir
rar a fichero.rar carpeta/fichero*
  • Descomprimir
unrar x fichero.rar
  • Ver contenido
rar v fichero.rar
rar l fichero.rar

BZ2 – bzip2 compressed data

  • Comprimir (creará un fichero llamado archivo.bz2)
bzip2 archivo
bunzip2 archivo
  • Descomprimir
bunzip2 archivo.bz2
bzip2 -d archivo.bz2
  • Ver contenido

No tiene opción de listar

TAR.BZ2 – bzip2 compressed data

  • Comprimir

tar -c ficheros | bzip2 > archivo.tar.bz2

  • Descomprimir

bzip2 -dc archivo.tar.bz2 | tar -xv

  • Ver contenido
tar jvxf archivo.tar.gz
bzip2 -dc archivo.tar.bz2 | tar -t

Es importante saber que gzip ó bzip2 sólo comprimen ficheros. Para comprimir directorios usaremos tar.

Hay que recordar, que podemos ver todas las opciones de cada comando con el parámetro –help. P.e:

 tar --help

Entradas relacionadas

Etiquetas: , , , , , , , ,


mar 13 2010

Hacer backups y restaurar base de datos Mysql

Category: MysqlDavid González @ 16:48

Vamos a comenzar este blog con unas recetas, para algunas de las tareas más cotidianas que hacemos normalmente los administradores de sistemas. En este primer post, trataremos como hacer un backup de una base de datos para posteriormente restaurarla.

Para hacer el backup vamos a usar el comando mysqldump. Vamos a poner varios ejemplos:

- Backup de todas las bases de datos

mysqldump -u root -p --all-databases > /root/backup.sql

- Backup de una base de datos en concreto.

mysqldump -u root -p nombre_bd > /root/backup_nombre_bd.sql

- Backup de la estructura:

mysqldump -u root -p --no-data nombre_bd > /root/nombre_bd.sql

- Backup de sólo datos (inserts):

mysqldump --complete-insert --no-create-info -u root -p nombre_bd > /root/nombre_bd.sql

A veces es útil saber, que se puede poner la contraseña en la misma linea, a continuación de la opción “-p” sin espacios. Por ejemplo:

mysqldump -u root -pCLAVE --all-databases > /root/backup.sql

Por si queréis más información, en la página de mysql esta toda la información así como las opciones que tiene este comando. También podéis probar a sacar la ayuda de mysqldump con:

mysqldump --help

Para restaurar una base de datos, el proceso es el siguiente:

mysql -u root -p nombre_bd < /root/nombre_bd.sql

Entradas relacionadas

Etiquetas: , , , ,