Programación en Bash
by Christian on Feb.09, 2010, under Recursos, Tecnologia
Bueno, este es un excelente tutorial de programacion en bash… he aprendido mucho con el y ademas he aclarado muchas dudas… lo tome del wiki de gulix.cl http://www.gulix.cl/wiki y lo dejo aca porque necesitaba tenerlo para consulta rapida… espero le sirva a alguien…
—-
bash es una de tantas shell de Linux, la más popular en las distribuciones recientes como Ubuntu, Fedora o Mandriva. En la actualidad la gran mayoría de los scripts de configuración de las distribuciones de Gnu/Linux están programados en Bash, lo tanto para quien desee personalizar su sistema a fondo, tener conocimientos de bash es crítico.
En esta breve guía mostraremos varios ejemplos de programación en bash como ejemplo de los ciclos y sentencias de control vistas.
Dudas básicas antes de comenzar
¿Qué es un shell?
- El shell es un interprete de comandos.
- Pero también es un lenguaje.
- El conjunto de comandos es un script.
- Un script sirve como ‘pegamento’ de diversos comandos sencillos, que en conjunto son considerablemente poderosos.
¿Por qué aprender a programarlo?
- Te evita hacer tareas repetitivas.
- Es bueno conocerlo.
- Es fácil de aprender: piensa que quieres hacer – escríbelo – revísalo (ahora ponlo todo en un archivo o script).
- Usualmente no tienes que debugear mucho, es como si vaciaras lo que harías en el prompt de comandos, pero escrito en un archivo.
- Es ideal para hacer algunos prototipos.
¿Cómo creo un script?
- Crea un archivo miscript.sh con tu editor de textos favorito.
- Dale permisos de ejecuci\’on: $chmod +x miscript.sh.
- Ejecutalo: $./miscript.sh
introducción
Para programar en bash se pueden utilizar todos los comandos del sistema, llamadas a otros script bash, funciones internas, y rutinas en otros lenguajes, estas características hacen que bash sea una herramienta potente que no pasa de moda.
hola mundo
#!/bin/bash echo "Hola Mundo"
En este ejemplo, la primera línea le indica al sistema qué programa ejecutará el resto de instrucciones que están en el script. En este caso el programa es bash y la ruta donde esta ubicado el binario es /bin/bash. La segunda línea es una instrucción de bash, que permite imprimir en pantalla la frase “Hola Mundo”
Si quisiéramos usar variables, podemos crear un hola mundo como sigue:
#!/bin/bash saludo="Hola Mundo" echo $saludo #esto escribe Hola Mundo
De este par de ejemplos podemos ver básicamente los siguientes puntos:
- un programa en bash comienza por buena costumbre con #!/bin/bash
- al crear una variable se coloca el nombre de la variable seguido por un = y el valor que contendrá
- al invocar una variable se le antepone el signo $ al nombre de esta.
- los comentarios empiezan con #
nota
entre la variable, el = y el valor no deben existir espacios
Una tercer versión del hola mundo puede ser la siguiente:
#!/bin/bash saludo="Hola" echo "$saludo Mundo"
Notese que con las comilla sigue siendo el resultado el mismo (Hola Mundo) y no $saludo Mundo
utilización de variables
Ya comenzamos en la sección hola mundo a ver la utilización de variables, pero su potencialidad es mayor, dado a que se puede almacenar un una variable el resultado de alguna operación, por ejemplo, podriamos crear un bash que nos salude dando algunos datos del día y semana del año en curso, como el script que sigue:
#!/bin/bash ddY=$(date +%j) smY=$(date +%U) echo "Hola, hoy es el dia $ddY del año y esta es la semana $smY"
Notemos que para asignar un valor de un comando, este necesita ser evaluado, para ello es que se utiliza el $( )ç
Evaluaciones numéricas
un ejemplo.
#!/bin/bash total=$((1+1)) echo $total
Utilizando let
#!/bin/bash let x=1 # le asigno 1 a x let x+=1 # lo incremento en 1, el termino += es equivalente al de C echo $x # muestra 2
let permite utilizar asignaciones y operaciones de asignación equivalentes a las de C, otras operaciones son
- incremento +=
- decremento -=
- mutiplicar por *=
- dividir por /=
- modulo por %=
- incremento en 1 ++
- decremento en 1 –
Utilizando read
read se usa para leer una variable desde la entrada común stdin
#!/bin/bash echo -n "ingrese su nombre: " read nombre echo "Hola $nombre"
Concatenación de cadenas
un ejemplo.
#!/bin/bash cadena1="hola" espacio=" " cadena2="mundo" echo $cadena1$espacio$cadena2
Caracteres especiales
- # indica un comentario
- ; separador, permite tener dos o más instrucciones en la misma linea
- ;; terminador de bloques en la instrucción case
- : instrucción que no hace nada, el típico NOP (do-nothing operation)
- ! indica negación
- * indica todo, si se usa como operación arimética, indica multiplicación
- ** multiplicación exponencial.
Sentencias de Control
Antes de comenzar con las sentencias propiamente tal, nos detendremos en un par de operadores para crear las sentencias condicionales y así poder armar algunas expresiones a evaluar.
algunos operadores
Operadores para operaciones numéricas y lógicas
- No !
- y &&
- o ||
- menor o igual -le
- mayor o igual -ge
- mayor que -gt
- menor que -lt
- igual que -eq
- distinto que -ne
- operador lógico AND -a
- operador lógico OR -o
Operadores para la gestión de archivos
- -f Si es un archivo tradicional
- -d Si es un directorio
- -r Si tiene permisos de lectura
- -w Si tiene permisos de escritura
- -x Si tiene permisos de ejecución
- -s Si tiene una longitud mayor que cero
if else
ejemplos:
#!/bin/bash if((4 < 6)); then echo "cuatro es menor que seis" fi
#!/bin/bash if((4 > 6)); then echo "cuatro es mayor que seis" else echo "cuatro no es mayor que seis" fi
case
ejemplo: el siguiente script recibe un parametro e indicará el valor el palabras, en caso que sea uno de los que estén en la lista de lo contrario no hará nada.
#!/bin/bash numero=$1 case $numero in 1) echo "uno" ;; 2) echo "dos" ;; 3) echo "tres" ;; 4) echo "cuatro" ;; 5) echo "cinco" ;; 6) echo "seis" ;; 7) echo "siete" ;; 8 ) echo "ocho" ;; 9) echo "nueve" ;; esac
for
Un ejemplo típico de for es borrar todos los archivos de respaldo .bkp de los subdirectorios. En una linea de comando sería:
for i in $( find | grep "\.bkp" ); do echo "borrando $i"; rm -rf $i; done
En un script
#!/bin/bash
for i in $( find | grep "\.bkp" );
do
echo "borrando $i"
rm -rf $i
done
En pocas palabras, lo que está haciendo el for, es lo siguiente:
- para cada i en lo encontrado por la sentencia find | grep “\.bkp”
- muestra “borrando $i”
- borra $i
veamos otro ejemplo de un for aplicando la lógica tradicional de los lenguajes de programación.
#!/bin/bash
cadena=""
for((a=0;a<8;a++))
do
cadena=$cadena$a
echo $cadena
done
donde se obtiene como resultado lo siguiente:
./lala.sh 0 01 012 0123 01234 012345 0123456 01234567
while
ejemplo:
#!/bin/bash CONTADOR=0 while [ $CONTADOR -lt 10 ]; do echo El contador es $CONTADOR let CONTADOR=CONTADOR+1 done
until
ejemplo:
#!/bin/bash
CONTADOR=20
until [ $CONTADOR -lt 10 ]; do
echo CONTADOR $CONTADOR
let CONTADOR-=1
done
Funciones
La utilización de funciones dentro de cualquier script pueden simplificar mucho el código, además de mejorar estéticamente la presentación y comprensión del mismo.
vemos un ejemplo simple :
#!/bin/bash
function funcion1 {
echo "estamos en la 1 y le pasamos el parametro:"$1
}
function funcion2 {
echo "estamos en la 2 y le pasamos el parametro:"$1
}
# ahora a ejecutarlas!
funcion1 hola
funcion2 chao
la salida en este caso es la siguiente:
estamos en la 1 y le pasamos el parametro:hola estamos en la 2 y le pasamos el parametro:chao
Menús de selección sencillos
un ejemplo simple:
#!/bin/bash
echo "te gusta el loly?"
OPCIONES="si no"
select opt in $OPCIONES; do
if [ "$opt" = "si" ]; then
echo que bien!
exit
elif [ "$opt" = "no" ]; then
echo que mal!
exit
fi
done
Ejemplos
Ejemplo1: Script para recodificar todos los archivos .mp3 de un directorio especificado en la linea de comandos.
El objetivo es lograr un Script que permita recodificar los archivos Mp3 de un directorio específico, por ejemplo pasar todo un disco de 192Kbps a 128Kbps. La lógica nos dice que se deben seguir los siguiente pasos:
- paso 1 : entrar al directorio donde están nuestros archivos a recodificar.
- paso 2 : solo para cada uno de los archivos que sean .mp3, se realizarán los siguientes pasos.
- paso 3 : verificar si el archivo corresponde a un archivo y no a un link o un directorio.
- paso 4 : recodificar el archivo y guardarlo con otro nombre.
- paso 5 : ya no necesitamos el archivo viejo, asi que lo borramos.
- paso 6 : renombrar nuestro nuevo archivo recodificado con el nombre que tenía el archivo que borramos.
- paso 7 : si quedan más archivos por recodificar, volver al paso 2.
script:
#!/bin/bash
cd "$1"
for i in *.mp3
do
if [ -f "$i" ]; then
lame -h -b 128 "$i" "$i.mp3"
rm "$i"
mv "$i.mp3" "$i"
fi
done
El comando cd $1, nos permite entrar al directorio que le hemos indicado al script como parámetro. El comando for nos permite barrer todos los archivos que se filtren mediante la expresión *.mp3, es decir todos los archivos que terminen su nombre con .mp3. El comando if, permite asegurarse que el archivo realmente es un archivo y no un link roto o una carpeta, el comando lame es un codificador de audio, que en este caso se encargar de recodificar el archivo de turno en el for.
Ejemplo2: calcular el digito verificador de un rut chileno
#!/bin/bash
# generar el digito verificador a partir del rut sin digito :)
# by Lacosox.org
rut=12345678
div=1
serie=2
sum=0
verificador=0
for((a=0;a<8;a++))
do
temp=$((rut/div))
div=$(($div*10))
if [ $serie = "8" ]; then
serie=2
fi
sum=$(((((($temp-((((rut/div))*10))))*serie))+$sum))
serie=$(($serie+1))
done
verificador=$((11-(($sum%11))))
if [ $verificador = "10" ]; then
verificador=k
fi
if [ $verificador = "11" ];then
verificador=0
fi
echo "rut completo: "$rut"-"$verificador
Ejemplo 3 : Cada 10 minutos mostrar el mensaje “Anda a estudiar!”
#!/bin/bash #by lacosox.org total=$((10*60)) # 10 minutos son 10*(60 segundos) while ((0==0)); do sleep $total echo "Anda a estudiar!" done
Ejemplo 4: Función LastIndexOf para bash
Este método devuelve la primera posición dentro del String donde comienza la subcadena pasada como argumento, pero realizando la búsqueda de derecha a izquierda.
#!/bin/bash
#Función LastIndexOf by lacosox.org
# retorna la posición donde está la subcadena, buscando de atrás hacia adelante, si no existe, retorna 0.
#
function lastIndexOf {
todo=$1;
cadena_a_buscar=$2;
largo_todo=${#todo};
largo_cadena_a_buscar=${#cadena_a_buscar};
if [ $largo_todo -ge $largo_cadena_a_buscar ];then
for((a=$(($largo_todo-$largo_cadena_a_buscar));a>=0;a--))
do
subcadena=${todo:a:largo_cadena_a_buscar};
if [ $subcadena = $cadena_a_buscar ];then
echo $((a+1));
break;
fi
done
else
echo "0";
fi
}
Ejemplo de uso:
function lastIndexOf {
todo=$1;
cadena_a_buscar=$2;
largo_todo=${#todo};
largo_cadena_a_buscar=${#cadena_a_buscar};
if [ $largo_todo -ge $largo_cadena_a_buscar ];then
for((a=$(($largo_todo-$largo_cadena_a_buscar));a>=0;a--))
do
subcadena=${todo:a:largo_cadena_a_buscar};
if [ $subcadena = $cadena_a_buscar ];then
echo $((a+1));
break;
fi
done
else
echo "0";
fi
}
si=`lastIndexOf "esta es la cadena esta" "ta"`;
echo $si
salida:
dalacost@lacosox.org:~$ ./test.sh 21
Link donde encontrar más ayuda
- Guía avanzada http://www.tldp.org/LDP/abs/html/index.html
- Guía de introducción a la programación en Bash, en español [1]
- Libro “El shell Bash”, muy completo sobre todo de la bash de Unix. [2]
- Administración_de_usuarios_y_grupos_de_usuarios
- Comandos_básicos_en_Linux
Autores de este tutorial
—-
fuente:
http://www.gulix.cl/wiki/Programaci%C3%B3n_en_Bash
Cosas que hacer cuando estas aburrido
by Christian on Feb.09, 2010, under Humor, Texto
Es cosa de usar la imaginacion….
* Parpadear rápidamente y luego cerrar los ojos muy fuerte para disfrutar del show de luces.
* Ver cuánto tiempo puedes sostener una nota cantando
* Trata de no pensar en pinguinos
* Imita a un robot
* Usa tu poder mental secreto para intentar mover algo
* Ponle nota a la gente que va pasando
* Repite una palabra una y otra vez hasta que pierda su significado
* Imita a un auto
* Haz ruidos de efectos especiales cada vez que se abra una puerta o se mueva algo
* Mira la tele y repite todo lo que se diga con acento italiano
* Organiza un concurso de hacer gárgaras
* Organiza un concurso de quién es menos competitivo
* …
—
Post original:
THINGS YOU CAN DO WITH ABSOLUTELY NOTHING
Blink wildly and then close your eyes really tight for an interesting light show
(Amusement Potential: 1-5 minutes)
See a variety of blobs, stars and flashes. Try to make out shapes and see if your subconscious is trying to send you a message (perhaps that funny shape is saying, ’send all your money to urban75.com’?)
See how long you can hold a note
(Amusement Potential: 4-20 minutes)
Not that much fun, but it sure passes the time. Play with a friend, or try to beat your own personal best. Inhale deeply and then try and make a noise for as long as you can. Earn extra points for making your partner laugh or ending on an amusing note.
Try to not think about penguins
(Amusement Potential: 1-5 minutes)
This is especially hard, because by trying too much, you remember what you were trying to avoid thinking of. If you try too little, you end up thinking about penguins anyway.
Use your secret mind power
(Amusement Potential: 5-10 minutes)
Pick a passing by and try to use your mind power to command them do something, like drop their bag or knock into someone. The law of averages dictates that sooner or later one of your mind commands will come true, so you can convince yourself that you really have super human powers and waste even more time trying them out.
Pretend you’re a robot
(Amusement Potential: 1-3 minutes)
Walk down the street with mechanical movements, adding ‘zzzzzt’ sounds with each motion. Pretending to have a motor broken in, say, your left hand can add at least 30 seconds more entertainment.
Scratch yourself
(Amusement Potential: 1-3 minutes)
Go ahead, scratch yourself now. Even if nothing itches, go ahead. Doesn’t that feel pretty good?
Rate passers by
(Amusement Potential: 10-15 minutes)
Secretly award passers by marks out of ten as you go along, offering (unsaid) expert criticism over their clothing, hairstyle and footwear choices.
Repeat the same word over and over until it loses its meaning
(Amusement Potential: 1-3 minutes)
Pick a random word out of a magazine and say it aloud to yourself until it becomes a meaningless set of noises.
Pinch yourself
(Amusement Potential: 1-3 minutes)
What is pain? Why is it unpleasant? There’s nothing physical about it – it’s all in your mind. Plus, after pinching yourself for awhile, boredom will seem nice next to being in pain.
Try to swallow your tongue
(Amusement Potential: 1-2 minutes)
There’s not much to say about this one. It is possible, but really stupid.
Pretend to be a car
(Amusement Potential: 5-10 minutes)
Make appropriate revving noises in your head as you walk along and add a racing commentary as you pass strangers in the street. Use blinking eyes as indicators for extra authenticity.
Make Star Trek door noises
(Amusement Potential: 1-2 minutes)
Stand by an electric door to a bank or something and make that silly “Scccccccchwop” sound heard whenever people popped on to the bridge to hang with Captain Kirk.
Look at something for awhile, shut eyes, study after image
(Amusement Potential: 2-5 minutes)
Another great time waster. It takes about 30 seconds of staring to create an after image, and the image is then viewable for about the same length of time. Fun to combine this one with pushing on your eyes.
Get yourself as nauseated as possible
(Amusement Potential: 5-10 minutes)
Best achieved by looking straight up and spinning around. Try to be so dizzy you can’t even stand up. This is also entertaining due to the “makes boredom seem a lot better” effect (see “Hurt Yourself”).
Invent a weird twitch
(Amusement Potential: 5-10 minutes)
Adopt a bizarre twitch (e.g. flicking your head irregularly, twitching with eye or busting out sporadic cough noises) and try it out when you go shopping.
Make a low buzzing noise
(Amusement Potential: 15-30 minutes)
Hours of fun in libraries! Keeping a totally straight face and looking nonchalant, make a low pitch humming/buzzing noise and see who reacts.
—
fuente:
http://manzanamecanica.org/2005/09/cosas_hacer_cuando_estas_aburrido.html
proxy squid, como “acelerador” de internet
by Christian on May.22, 2009, under Recursos, Tecnologia
Me quede mirando aquel viejo computador pensando de que forma podria hacer algo util por la vida… mientras leia algunas noticias por aqui y por alla… vino a mi mente la idea… squid…
Squid es un servidor proxy o intermediario; una de sus muchas funciones es que puede “acelerar la navegacion” de tu conexion…
Como funciona…
Suponiendo que hay paginas que visitamos con frecuencia, se almacenan en nuestro proxy la primera vez que la solicitamos; de ahi en adelante, la descargamos del proxy en vez de el servidor real y por ende es mas rapido y se ahorra ancho de banda… (dejando mas apra descargas, por ejemplo)…
Para saber si la pagina que intentamos visualizar a cambiado, solo gastamos un paquete en comprobarlo… si ha sido modificado… la cargamos nuevamente y listo…
Suponiendo que es una pagina con noticias… cambian constantemente… pero.. en ese caso, mantenemos una copia de las imagenes y datos que son estaticos, y solo bajamos el texto que ha sido modificado…
en la proxima publicacion ire publicando paso a paso como configurarlo… en caso particular, lo he probado en FreeBSD y en Debian, sin generar problemas.
Cuenta regresiva para Ubuntu 9.04
by Christian on Feb.28, 2009, under Codigo abierto, Noticias, Tecnologia
Ubuntu 9.04 Jaunty Jackalope… ya hemos empezado a contar los dias…
Esta nueva version, promete muchas mejoras… entre ellas destacan soporte para Ext4, mayor rapidez del arranque y mas compatibilidad con netbooks.
Nuevo intento de Facebook de apropiarse del material de sus usuarios
by Christian on Feb.18, 2009, under Noticias, Tecnologia
Miles de usuarios abandonan Facebook debido a un controvertido cambio en las condiciones de uso del servicio, según el cual la empresa se arroga un derecho perpetuo a usar el material de sus usuarios, negándoles de paso todo derecho a recuperarlo.
Diario Ti: Recientemente, Facebook aplicó algunos cambios a las condiciones de uso del servicio, mismos que pasaron desapercibidos para la mayoría de los usuairos. Facebook eliminó, lisa y llanamente, un artículo del contrato relacionado con los derechos de los usuarios sobre su propio material.
El contrato actualizado concedía a Facebook derechos totales al material subido por el usuario a su cuenta, incluso después que este la hubiera cerrado y abandonado definitivamente el servicio. El material en cuestión incluye información personal, fotografías y otras usos dados por el usuario a su cuenta de Facebook. Facebook se otorga a sí misma el derecho a archivar, usar, transferir y vender tal material a terceros.
En concreto, Facebook eliminó la siguiente cláusula:
“Usted puede eliminar su contenido del sitio cuando lo estime conveniente. Si lo hace, la licencia expirará automáticamente. Sin embargo, usted autoriza a la compañía a conservar copias de su contenido de usuario”.
Los cambios en cuestión implican que Facebook cambió el contrato asignándose un derecho perpetuo a usar el material, negando al usuario todo derecho a recuperarlo.
Durante el fin de semana pasado, la organización estadounidense de consumidores Consumers Union se refirió al tema, dándole así gran publicidad.
El lunes 17 de febrero, el fundador de Facebook, Mark Zuckerberg, explicó que el cambio obedecía a “razones prácticas”.
En su blog, Zuckerberg escribe que la intención era que si un usuario escribía algo en el diario mural de otro usuario, tal comentario no desaparecería si aquel cancelaba su cuenta.
Sin embargo, la explicación no fue convincente para sitios especializados como Mashable, que expresa fuerte escepticismo ante la actitud de Facebook de “confía en nosotros, somos buenos”.
Admitiendo tácitamente su abusivo cambio del contrato, Facebook optó por retractarse el martes 18 de febrero. Así, los usuarios que se conectan hoy son notificados que Facebook ha revocado los cambios aplicados hace dos semanas.
El tema causó tal indignación entre los usuarios de Facebook, que incluso se creó un grupo dedicado específicamente a persuadir a la empresa de desistir de su intento de apropiarse de los contenidos de sus usuarios. Cabe señalar que Facebook mantiene plenamente vigente una cláusula que indica que el contrato es un documento dinámico, que puede ser modificado cuando la empresa lo estime conveniente.
fuente: http://www.diarioti.com/gate/n.php?id=21288
Alargando el Periodo de Vida de los Disos Duros – Linux no mata discos duros, se mueren solos
by Christian on Feb.18, 2009, under Noticias, Tecnologia
Resulta que hay una tecnología de fabricación de discos duros llamada de Load/Unload (Un Whitepaper muy aconsejable en PDF sobre el tema: Ramp : Ramp Load/Unload Technology in Hard Disk Driver, encontrado en Broken HDDs) cada vez más extendida, sobre todo en discos duros de portátil. Consiste en que el cabezal de lectura/escritura, en vez de estar permanentemente volando sobre el disco, se aparca frecuentemente, lo que teóricamente permite una mayor duración del disco, menor consumo y mayor protección contra golpes.
Ramp Load Unload Technology
Sin embargo, no se puede aparcar la cabeza un número indefinido de veces, sino que estos discos están preparados para un número máximo de ciclos de carga/descarga del cabezal que según el disco en cuestión puede ser de orden de 300K o 600K ciclos (K=1000). No es que justo cuando se llegue a ese número el disco va a dejar de funcionar de repente, sino que a partir de ahí el fabricante ya considera que puede dejar de hacerlo en cualquier momento. Paul nos cuenta que en varios de sus discos ha llegado a 600K, 900K y 1200K ciclos de carga/descarga antes de que empezaran a dar problemas. Pero eso sólo ¡en un año!
Yo me interesé por el problema nada más leer sobre él porque el disco de 2.5″ de marca Western Digital que tengo conectado a la EPIA EX10000EG (apareció de pasada en la entrada Sobre las VIA EPIA (V) ) hacía clicks muy frecuentemente. Lo notaba mucho porque cuando el disco se quedaba idle durante unos segundos, al volver al trabajajo casi siempre hacía un click que me disgustaba mucho pero que pensaba que sería normal (es un disco nuevo y tras varios tests no había encontrado ningún error). Ahora sé que cada vez que se oye uno de esos clicks lo más normal es que sea el cabezal en un ciclo de carga/descarga.
Pues bien, resulta que consultando los parámetros S.M.A.R.T. del disco con el comando smartctl, me encuentro con que el disco ya ha usado 7755 ciclos:
# smartctl -a /dev/hdc | egrep ‘ID|Load_Cycle’
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
193 Load_Cycle_Count 0×0032 198 198 000 Old_age Always – 7755
Y no penséis que esta máquina se tira encendida semanas y semanas, ¡no!. Para llegar a ese número de ciclos, ese disco sólo ha pasado por una instalación de Debian y por todas las pruebas que le hice a la EX10000EG, incluyendo varios ratos de reproducción de vídeo. Por tanto, que haya consumido ya 7755 ciclos, que podría ser alrededor del 3% de los que el fabricante permite antes de que el disco sea declarado como “envejecido”, es una auténtica barbaridad.
En unas pruebas rápidas he podido ver que el número de ciclos crece muy rápidamente en pocos minutos y sin apenas usar la máquina:
Sun Oct 28 02:11:51 CEST 2007
193 Load_Cycle_Count 0×0032 198 198 000 Old_age Always – 7744
Sun Oct 28 02:15:51 CEST 2007
193 Load_Cycle_Count 0×0032 198 198 000 Old_age Always – 7753
Sun Oct 28 02:16:28 CEST 2007
193 Load_Cycle_Count 0×0032 198 198 000 Old_age Always – 7754
Como se comenta en los enlaces que hablan del problema, con el comando “hdparm -B” podemos modificar el nivel de gestión de energía que ha de tener el disco (usando APM):
# man hdparm
[...]
-B Set Advanced Power Management feature, if the drive supports it. A low value means
aggressive power management and a high value means better performance. A value of 255
will disable apm on the drive.
[...]
Podemos reducirlo al máximo:
# hdparm -B 254 /dev/hdc
/dev/hdc:
setting Advanced Power Management level to 0xFE (254)
O incluso deshabilitarlo:
# hdparm -B 255 /dev/hdc
/dev/hdc:
setting Advanced Power Management level to disabled
El caso es que tras hacer lo último, el valor de Load_Cycle_Count en la salida del smartctl ya no crece más que en una unidad cuando arranco, así que me lo he puesto en el fichero /etc/rc.local, para que se ejecute siempre durante el arranque. Los clicks también han desaparecido, así que todo es mucho mejor ahora.
Y es que en este sistema, aunque le puse un disco de 2.5″ para que no consumiera mucho porque la fuente es tan sólo de 60W, tampoco necesito que sea muy estricto en materia de ahorro de energía como si se tratara, por ejemplo, de un portátil trabajando con baterías, y prefiero evitar un envejecimiento prematuro del disco.
El problema con Ubuntu, el que ha creado toda esta alarma, es que en modo laptop, que no está habilitado por defecto, el fichero /etc/acpi/power.sh configura el disco para que ahorre energía de la forma más agresiva posible, con -B 1, haciendo que el disco tenga muchos más ciclos de carga y descarga y muchos más clicks:
function laptop_mode_enable {
…
$HDPARM -S $SPINDOWN_TIME /dev/$drive 2>/dev/null
$HDPARM -B 1 /dev/$drive 2>/dev/null
}
En un bug report del problema que ya tiene bastantes meses, alguien ha probado con distintos valores de -B:
-B 128 -> 23 cycles in 10 minutes
-B 160 -> 29 in 10′
-B 180 -> 0 in 10′
-B 196 -> 0 in 10′
-B 200 -> 0 in 10′
Se ha generado alarma por Ubuntu e incluso en algunas otras distribuciones pero, en realidad, hay firmwares y BIOS que ya activan modos APM agresivos durante el arranque, como leemos en Problem with hard drive clicking, y como me ha pasado a mí mismo, que estaba sufriendo el problema con una Debian que no toca absolutamente nada de los parámetros del disco.
¿Y el problema no pasa en Windows? Pues yo no tengo ningún disco que haga clicks y que tenga Windows para probar si tras un rato de funcionamiento el valor de Load_Cycle_Count crece, pero yo esperaría que sí, ya que Windows suele optimizar bastante bien el consumo de energía en portátiles (los fabricantes de los mismos en realidad lo prueban todo en Windows).
Sí que puede ocurrir que en Linux los ciclos de carga y descarga ocurran mucho más a menudo, porque en Linux el kernel y los procesos se dedican a escribir muy frecuentemente en disco, siendo los periodos en los que el disco está idle mínimos. Cualquiera que haya intentado que un disco duro se quede parado tras un periodo de inactividad del sistema en Linux, se habrá dado cuenta de que no es una tarea fácil:
* sync: why disk cannot spin down
* Linux Hard Disk Spin-Down
* HOWTO HDD spindown small server
Pero para mí, me parece que lo más importante a recalcar es que en raíz, esto no es un problema de ningún sistema operativo, ni de ninguna distribución: ni Ubuntu, ni Debian, ni Fedora, ni Windows. No perdamos de vista que esto es un problema generado artificialmente por los fabricantes de discos duros que hacen su hardware con absurdas limitaciones.
Y, por cierto, no olvidemos que este es un problema sólo de los discos que se fabrican con esta tecnología de load/unload, a los que también podríamos llamar click-powered hard disks. En otros discos, dicho contador ni se estrena:
# smartctl -a /dev/sdb | egrep ‘ID|Load_Cycle’
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
193 Load_Cycle_Count 0×0032 253 253 000 Old_age Always – 0
Una curiosidad para acabar: ¿Sabías que con la opción -M del hdparm puedes configurar tu disco para que intente hacer menos ruido?
:wq
Actualización 1/1/08: En A vueltas con el “hdparm -B” en Debian Lenny vuelvo a tratar el tema, enfocándolo esta vez a ver cómo están tratando el problema los desarrolladores de Debian en Lenny.
Actualización 2/5/08: Hace tiempo que está en los comentarios, pero creo que es importante recalcar que en lugar de añadir el comando “hdparm -B 254” al fichero /etc/rc.local, es mejor editar el fichero /etc/hdparm.conf y poner algo así (cambiando el fichero de dispositivo y el valor de apm según nuestras necesidades):
/dev/sda {
apm = 254
}
Seguido por el comando:
update-rc.d hdparm defaults
para que el hdparm se ejecute durante el arranque.
Actualización 5/5/08: Parece que en Ubuntu Hardy Heron no hay /etc/init.d/hdparm, de modo que probablemente siga siendo buena idea usar el /etc/rc.local.
Actualización 24/5/08: La página Bug #59695 High frequency of load/unload cycles on some hard disks may shorten lifetime contiene una excelente explicación del problema así como una lista de discos duros afectados y del valor de “hdparm -B” más conveniente para solucionar el problema en ellos. Me ha gustado especialmente el siguiente párrafo:
The disk Load_Cycle_Count issue appears to be caused by a combination of two problems — The first is overly-aggressive power management from what might be considered buggy hardware. The second is that Ubuntu appears to be touching the hard drive on a regular basis for one reason or another.
ya que afirma claramente lo que yo siempre he defendido en esta entrada: Que esto es un problema de los fabricantes de discos duros. Que se agrava por cómo Linux usa el disco duro, de acuerdo, pero en primer lugar es un problema de cómo los fabrican.
fuente: http://www.vicente-navarro.com/blog/2007/10/28/linux-no-mata-discos-duros-se-mueren-solos/
El reloj de UNIX alcanzará un hito el viernes 13
by Christian on Feb.13, 2009, under Noticias, Tecnologia
Todos los sistemas Unix y derivados están provistos de un reloj interno que cuenta el número de segundos desde la medianoche del primero de enero de 1970, UTC (Coordinated Universal Time). El sistema es denominado Unix Time o POSIX-Time. Esta semana, lo segundos transcurridos desde esa fecha llegarán al especial número 1234567890.
Con el paso de los años, el tiempo Unix ha sido objeto de diversas definiciones. Según Wikipedia, las primeras versiones del tiempo Unix consistían de un número entero de 32 bits incrementado a una frecuencia de 60 Hz, lo que coincide exactamente con el reloj del sistema en el hardware de los primeros sistemas Unix. Sin embargo, con una frecuencia tan elevada 232 equivale solamente a 2,5 años. Por tal razón, luego se adaptaría un sistema de frecuencia de 1 Hz.
En la mayoría de los sistemas operativos modernos derivados de Unix, incluido Linux, se usó número entero de 64 bits para representar el tiempo Unix. La variante de 32 bits no funcionará adecuadamente después del 19 de enero de 2038. Con la representación de 64 bits, el reloj seguirá marcando la hora, sin inconveniente alguno, durante 2 mil millones de años más.
En ésta página (http://coolepochcountdown.com/) puede verse un reloj que lleva la cuenta regresiva (o en realidad ascendente, como indican los autores del sitio) hasta la hora 1234567890.
fuente: http://diarioti.com/gate/n.php?id=21218
a 3 dias de debian 5
by Christian on Feb.11, 2009, under Noticias, Tecnologia
en este enlace
http://www.linuxhispano.net/portal/noticia/proyecto-debian-versión-5
se avisa que el dia 14 de febrero estara liberada la ultima version de debian… “lenny”.
virus vs linux
by Christian on Feb.11, 2009, under Noticias
Durante décadas, Unix fue el único Sistema Operativo que estaba disponible, su cuota de mercado era del 99 %. Durante todo ese tiempo nunca hubo un virus. Los virus aparecieron al sumar Windows + Internet. Hay quienes dicen que Windows no es un sistema operativo verdadero, sino un “gestionador promiscuo de memoria y ejecutables”. Cuando un archivo llega a Linux (por Internet o porque se copia de un CD) no puede ejecutarse porque no posee permisos y aunque los tuviese, no puede activar ningún servicio porque no es dueño del demonio que lo ejecuta. Esto revela un Sistema Operativo maduro y bien diseñado. Existen otros peligros para Linux, como los troyanos o algún exploit, pero por cada uno de ellos hay miles de virus. Concluyendo: en Linux nunca habrá virus.
fuente:
http://www.somoslibres.org/modules.php?name=News&file=article&sid=541
casos de la vida real
by Christian on Feb.11, 2009, under Texto
Hace unos meses, una vecina vino a pedirme de favor si podía descargar e imprimir un documento Word que le habían enviado por hotmail, en ese momento yo estaba usando KDE. Ella abrió Mozilla, entró a hotm ail, al descargar el archivo, Mozilla sugirió OpenOffice.org ella dijo OK, el archivo sólo era de dos hojas, cambio unos títulos y las palabras que el corrector ortográfico le marco, dio un click en imprimir, redacto la respuesta en hotmail, se puso de pié para marcharse con su impresión, en la puerta me dijo “que raro Windows”, luego me dio las gracias y se m arch ó. Ella había usado Linux sin siquiera darse cuenta. Por supuesto, todo salió bien porque el quipo estaba correctamente configurado, com o si fuese un equipo OEM de fábrica. No es que Linux sea difícil y Windows fácil, lo que pasa es que nosotros somos la primera gene ración de usuarios y lo que encontramos fue Windows, si hubiese sido MacOS o NeXT u OS/2 hubiése mos aprendido a batallar con eso, pero en realidad Windows o Linux poseen el mismo grado de dificultad.
fuente: los 12 mitos sobre gnu/linux
http://www.somoslibres.org/modules.php?name=News&file=article&sid=541