martes, 29 de septiembre de 2009

Radio, Radio y más radio...

La radio para mi es indispensable cuando estoy haciendo cosas, y como por lo general paso gran parte del día frente a una pc, escucho la radio por internet.
Ya hace un tiempo que tengo el lema de que todo lo que se pueda hacer por consola, se debe hacer desde una (o sea todo!). Por eso para escuchar la radio, o cualquier archivo de audio, uso el mplayer (es mágico). Ahora, como de vez en cuando, por problemas de conectividad, se cortaba y tenía que volver a correr el comando, o en horas picos no se conectaba de una y tenía que andar reintentando hasta conectarme. Por este motivo me hice este pequeño script que usa un bucle al infinito para conectarse (en este caso a la rock and pop)


[pepo@bernard ~]$ cat $(which RandP)
#!/bin/bash
cont=0
while true; do mplayer http://streaming.fmrockandpop.com/rockandpop; cont=$(cont+=cont); echo $cont; done

Basicamente usa un while, infinito, para conectarse con mplayer al link de streaming de la rock and pop.

pepo

viernes, 25 de septiembre de 2009

Haciendo las cosas más simples con ssh

bueno, esto es algo práctico y simple para todos lo que como yo tienen un usuario en su linux diferente al que usar para otros equipos. En mi caso tengo un usuario para mi desktop y otro para los servidores en los cuales trabajo, por lo que cuando me conecto por ssh debo especificar ese usuario (con el opción "-l" o de la forma clásica user@host).
Para evitar siempre escribir el usuario, simplemente hay que crear primero el directorio .ssh y luego el archivo el siguiente archivo:


pepo@frank:~$vim /home/pepo/.ssh/config

Que tiene el siguiente formato:

Host *

user



En donde se pueden especificar los host y el user para cada uno.

jueves, 24 de septiembre de 2009

Si no chequeo el FileSystem HAY TABLA!

A veces nos topamos con un "problema" que aunque a primera vista parece complejo, tiene un solución simple, basicamente porque la raíz del problema que "atacamos" es otra.
Por esto, y para los que alguna vez les paso, nunca hay que olvidar de primero verificar el file system de su Linux, ya que más de una vez me he dado la cabeza contra la pared intentando solucionar algo y resultó que el problema era un file system lleno.
Por eso, como regla, siempre correr:



pepo@frank:~$ df -h

S.ficheros Tamaño Usado Disp Uso% Montado en

/dev/sda2 15G 13G 1,3G 91% /

varrun 378M 292K 378M 1% /var/run

varlock 378M 0 378M 0% /var/lock

udev 378M 48K 378M 1% /dev

devshm 378M 76K 378M 1% /dev/shm

lrm 378M 39M 339M 11% /lib/modules/2.6.24-23-generic/volatile

/dev/sda1 45G 24G 21G 54% /media/hda1



Y luego de chequearlo seguir adelante.

miércoles, 23 de septiembre de 2009

Afinidad de los procesos

Cambiar la afinidad (el cpu donde corre) un proceso, es algo que en algún momento podríamos necesitar. Como ya me ha pasado de necesitarlo aca va como hacerlo.
En GNU/Linux tenemos el comando taskset (se encuentra el paquete schedutils) por lo que si no lo tenemos los debemos instalar primero

Debian/Ubuntu)





# apt-get install schedutils

RHEL/Fedora)






# yum install schedutils

Una vez instalado basicamente debemos buscar el PID (process ID) al cual le queremos cambiar la afinidad, el comando ps auxf es el candidato para ello, y una vez obtenido podremos ver la afinidad y si queremos luego cambiarla de la siguiente forma:


En mi caso tengo un procedor dual core, y el proceso elegido para cambiar la afinidad es el demonio sshd que por default corre en ambos procesadores



Busco el pid:

pepo@luca:~$ ps ax |grep sshd|grep -v grep
 5459 ?        Ss     0:00 /usr/sbin/sshd 

Verifico la afinidad:

pepo@luca:~$ taskset -pc 5459
pid 5459's current affinity list: 0,1

Cambio la afinidad:

pepo@luca:~$ sudo taskset -pc 0 5459
pid 5459's current affinity list: 0,1
pid 5459's new affinity list: 0

Y con esto ya el demonio sshd só:lo corre en el core 0 :D

martes, 22 de septiembre de 2009

Particionando discos desatendidamente....

La mágia de la virtualización me llevo a tener que rebuscarmelas para particionar un disco de forma desatendida, cuando el equipo levanta y sólo la primera vez que levanta la vm (virtual machine), luego de googlear un poco (y gracias a algunos links que me pasaron :D ), logre realizar lo que necesitaba con el siguiente script.

#!/bin/bash

function valid {

if [ $? -eq 0 ];then
return 0
else
exit 1
fi

}

function clean {

#borro links simbolicos y archivo

rm -f /etc/init.d/start_up.sh
rm -f /etc/rc[2-5].d/S15start_up.sh

}

hdc=$(fdisk -l /dev/hdc |grep GB|awk -F"," '{print $2}'|awk '{print $1}')
let hdc_mb=$hdc/1048576
valid
#echo "espacio de particion" $hdc_mb
echo -e "n\np\n1\n\n+${hdc_mb}M\nt\n83\n\np\nw\n" | fdisk /dev/hdc
valid
mkfs.ext3 -q /dev/hdc1
valid
echo "/dev/hdc1 /opt ext3 defaults 0 1" >> /etc/fstab
valid
mount -a
valid
echo "particionamiento ok"
clean


En resumen, siempre mi disco nuevo a particionar era hdc, por eso lo primero que hago es obtener su tamaño en MB , luego uso una tuberia (pipe) para alimentar a fdisk de los comandos necesarios para crear una nueva partición primaria del tamaño total del disco.
Esto es la línea:

echo -e "n\np\n1\n\n+${hdc_mb}M\nt\n83\n\np\nw\n" | fdisk /dev/hdc

Que le pasa:
"n" -- Nueva partición
"\n" -- Enter
"p" -- Partición primaria
"\n" -- Enter
"1" -- Número de la partición
"\n" -- Enter
"\n" -- Enter (en este paso es donde pregunta desde que cilindro del disco, aceptamos el default )
+${hdc_mb}M -- Tamaño en MB
"\n" -- Enter
"t" -- Tipo de partición
"\n" -- Enter
"83" -- Tipo Linux
"\n" -- Enter
"\n" -- Enter
"p" -- Para imprimir la tabla de particiones
"\n" -- Enter
"w" -- Para escribir la tabla de particiones en el disco
"\n" -- Enter


Una vez realizado esto, sólo nos resta darle FS (mkfs.ext3) y agregar la entrada en fstab para que la monte de forma automática cuando se inicie el equipo.

Para finalizar, habrí que copiar este script en /etc/init.d y crear el script de inicio S* para que corra cuando levante el run level configurado.
Esto seria algo como:

Debian)

correr #update-rc.d start_up.sh start 15 2 3 4 5 .

RHEL/Fedora)
crear link simbólico

# for i in 2 3 4 5;do ln -s /etc/init.d/start_up.sh /etc/rc${i}.d/S15start_up.sh;done





En fin, con todo este procedimiento obtuve lo que necesitaba :D

pepo.

jueves, 10 de septiembre de 2009

lesson learned...

Cosas del día a día

Por diferentes motivos día a día van surgiendo pequeñas "cosas" u obstáculos que solucionar, la idea de este blog es ir documentandolos para ser una fuente de consulta confiable.

Dicho esté preambulo, ahí va el primero de lo que espero que sea una larga serie :)

Consultar una base de datos Oracle con perl sin usar el módulo DBI

Bueno, si bien perl nos probee el modulo DBI para servir de API contra diferentes tipos de bases de datos (Oracle, MySQL, etc), hace poco me encontré con el problema que algunos de los comandos nativos de PL/SQL (Oracle) no los tomaba la API por lo cual no podía utilizarla.
Puntualmente necesitaba conectarme a la base, activar la función timing (para saber cuanto tiempo necesito la consulta), obtener el resultado y luego desactivar la función timing y cerrar la conexión.
La función timing se habilita con la sentencia:

set timing on

La cual me producía un error utilizando DBI, por lo que luego de navegar un poco encontré la siguiente forma de hacerlo:


#!/usr/bin/perl -w



open ORA, "| $ORACLE_HOME/bin/sqlplus /\@" or die "Can't pipe to sqlplus: $!";

print ORA "set timing on\n";

print ORA ";\n";

print ORA "set timing off\n";

print ORA "exit\n";

close ORA;



Con este pequeño script pude obtener la salida necesaria para saber cual era el tiempo que tardaba en ejecutarse mi query :D