viernes, septiembre 08, 2006

Fechas del futuro

El otro día un usuario me llamó para decirme que tenía un problema extraño con una aplicación. Cuando arrancaba le salía el siguiente error:

system clock has been set back

A lo que inmediatamente le pregunto si ha cambiado la fecha del ordenador y me dice que sí, que estaba mirando el calendario del Windows y sin querer adelantó dos meses la fecha actual. Le digo que le ponga la fecha bien y pruebe otra vez, y me dice que ya lo ha hecho y sigue sin funcionarle.

Me acerco porque nunca me ha pasado algo como esto y quiero verlo con mis propios ojos. Primero sincronizo el reloj del ordenador al segundo con el controlador del dominio con el comando 'net time /set /yes \\servidor_de_dominio'. Vuelvo a intentarlo y nada, pasa lo mismo.

Desinstalo el programa y lo vuelvo a reinstalar un par de veces sin ningún resultado. Fijándome bien en la ventana del error me doy cuenta de que el problema no es del programa en sí (Ansys, en este caso) sino de su gestor de licencias, FlexLm. Lo siguiente que hago es reinstalar solo este componente, sin que tampoco se resuelva el problema. Después de desinstalarlo una vez más, elimino la carpeta donde estaba, que se había quedado sin borrar junto con un par de ficheros, y elimino toda referencia que encuentro en el registro del Windows. Reinicio, lo instalo, vuelvo a probar, y nada, que sigue sin funcionar.

Meto el error en el google y encuentro muchas páginas donde se habla sobre el error, pero ninguna dice cómo solucionarlo. Tras un buen rato al fin encuentro una pista. Viene a decir que hay que buscar todos los ficheros del ordenador que tengan fecha del futuro y borrarlos. Y que si alguno de ellos es del sistema (alguna DLL), entonces no queda más remedio que reinstalar el Windows.

Vuelvo al ordenador y hago eso, con el buscador del pu*o perro del XP busco todos los ficheros de fecha posterior a la que me encontraba y me salen muchos. Y como era de esperar, algunos son programas que si me los cargo así sin más puede suceder cualquier cosa. Y desde luego, me niego a reinstalar el ordenador solo porque a causa de un cambio de fecha uno de los programas no funciona. ¿Qué hacer? Si fuera un sistema Linux lo arreglaría en dos patadas con los comandos find y touch, pero en Windows no se cómo hacerlo. Mientras, el perro de la ventana de búsqueda me mira sonriente a través de la pantalla, como regondeándose de mi adversidad.

Entonces se me ocurre... ¿y por qué no arreglarlo igual que lo haría en Linux? No cuesta nada probarlo, así que voy y me bajo el Cygwin, que es un conjunto de utilidades y programas de Linux portadas a Windows, y que tiene herramientas como el bash, el find y el touch. Lo instalo, y observo con agrado que la instalación por defecto trae esas utilidades y no tengo que seleccionar entre varias decenas de paquetes adicionales, así que le doy a Siguiente -> Siguiete -> Siguiente y en pocos minutos lo tengo instalando.

Entonces me abro una ventana de bash y ejecuto estas dos únicas órdenes:

touch ahora_mismo.txt
find / -newer ahora_mismo.txt -exec touch {} \;

touch sirve para cambiar la fecha y hora a un fichero. Si no se especifica ninguna, pone la de ese momento. Si se indica un fichero que no existe (ahora_mismo.txt) lo crea vacío.

find es para buscar ficheros que cumplan alguna condición en todo el árbol de directorios, en este caso ficheros que sean más nuevos que el que acabo de crear. Con -exec le digo que para los ficheros encontrados ejecute la acción que va a continuación, que es de nuevo el comando touch para poner la fecha de ahora al fichero, que se indica mediante las dos llaves {}. El \; del final es para indicar el fin del comando.

O sea, lo que hace es buscar todos los ficheros del disco duro cuya fecha de creación sea del futuro, y a los que encuentre les ponga la fecha actual.

Lo dejo corriendo unos minutos mientras oigo como rasca el disco duro. Observo en la ventana del bash que además de en los ficheros busca también en las claves del registro de Windows, cosa que yo no sabía. No puede modificarlas porque no tiene permiso, pero me lo apunto en mi cabeza por si puede serme útil en el futuro. Cuando termina, procedo a lanzar otra vez el programa.

Y funciona :)

Eso es solucionar el problema 'a la Unix way'.

8 comentarios:

Anónimo dijo...

Maravilloso!! Estaba buscando solucionar justamente ese error y no conseguia nada ni siquiera en ingles... Gracias! Muy elegante solucion. Voy a probar a ver si me sirve en Windows Vista...

OS_C dijo...

Me alegro de que te sirva de ayuda Jase, ya me dirás si te funciona...

Un saludo.

Anónimo dijo...

Me acabas de solucionar la vida.
Mil gracias, espero que me funciona...Un saludo

OS_C dijo...

De nada anónimo, me alegro de que pueda servirte. Ya nos contarás que tal... y si nos quieres contar también cual era el problema, mejor todavía.

Un saludo.

Anónimo dijo...

Oye espectacular tu solución, creeme que me has salvado. por semejante estupidez, por que a mi por error se me habia cambiado la hora. pero es increible lo mediocre que es el sistema windows.

MaIsa dijo...

no me funciono :S nose que estoy haciendo mal... pongo lo que tu dices y me sale
touch: estableciendo la fecha de «/dev/conin»: Invalid argument
touch: estableciendo la fecha de «/dev/conout»: Invalid argument
touch: no se puede efectuar `touch' sobre «/dev/console»: No such device or address
touch: estableciendo la fecha de «/dev/dsp»: Invalid argument
touch: estableciendo la fecha de «/dev/full»: Invalid argument
touch: no se puede efectuar `touch' sobre «/dev/kmem»: Permission denied

no se que hacer!!

MaIsa dijo...
Este comentario ha sido eliminado por el autor.
Nathan dijo...

Hola!

Gracias por el aporte, lo estoy haciendo por segunda vez a ver si logro poner en marcha el programa. Pero hay archivos del registro que tendría que modificar también. ¿Cómo le doy permisos para que haga esto?

Nathan
Gracias!