Hola a tod@s, ha llegado el momento de poner en práctica lo que sabemos de vi para implementar esta característica.
Para ello tenemos que tener el cron instalado y en marcha, para comprobarlo vamos a entrar en el equipo con telnet y vamos a ejecutar el siguiente comando:
Código:
ps | grep cron
184 root 404 S /usr/local/etc/opt/sbin/cron
501 root 308 S grep cron
Nos tiene que aparecer una línea como la primera (la segunda es simplemente la ejecución de nuestro comando)
Si no aparece o no lo tienes instalado o no lo tienes arrancado.
Para instalarlo sigue mi post de Pag 35 #514
Para arrancarlo lo veremos mas adelante.
¿QUE VAMOS A HACER?
Antes de seguir he de advertir que esto puede ser peligroso, y aunque vamos a hacer copias de seguridad del fichero de arranque y una prueba de arranque, si las cosas no se hacen EXACTAMENTE como pongamos aquí, podemos encontrarnos con que el equipo no arranca y tendremos que volver a cargar el firmware.
Así que haz esto bajo tu responsabilidad.
Bien, pues vamos a editar el fichero de arranque que ejecuta el proceso principal, y le vamos a decir que, además de obedecer al mando a distancia, que también recoja las órdenes que le pongamos en un fichero que crearemos, con lo cual todo lo que se ponga en ese fichero se ejecutará como si hubiesemos tecleado algo en el mando.
De esa manera podemos enviar comandos de forma programada usando este fichero, y usando el cron que sirve para ejecutar procesos a una hora determinada y/o de forma periódica, vamos a enviarle al equipo una señal de apagado diariamente (o cuando y como queramos) a la hora que nos apetezca.
Ya sabemos todos entrar con telnet al equipo, pongo aquí el comando una vez mas:
Código:
telnet DIRECCION_IP_DEL EQUIPO
.... login: root
1) Nos situamos en el directorio /usr/local/etc
Código:
cd /usr/local/etc
2) Hacemos una copia de seguridad del fichero que vamos a "tocar"
3) Editamos el fichero con vi
A partir de ahora estamos dentro del fichero y ejecutaremos comandos de vi ¿OK?
4) Buscamos el arranque del cron
Esto busca la palabra cron dentro del fichero, se coloca en la linea de estado (inferior) y se ejecuta, si lo encuentra se posiciona el cursor en la línea (si se encuentra y pulsamos n (de next) buscamos la ocurrencia siguiente), si no lo encuentra, aparecerá en la línea de estado el mensaje: Pattern not found
El arranque del cron es una línea así:
Código:
/usr/local/etc/opt/sbin/cron
Si ya la tenemos nos saltamos este paso y si no la tenemos la introducimos entre las líneas
Código:
ln -s /mnt/dvdvr /dev/dvdvr
y....
# This variable tells DvdPlayer the firmware URL for internet updating
Para ello nos situamos sobre la línea: ln -s ... y ejecutamos el comando o (o minúscula) que nos abrirá una línea en blanco por debajo, copiamos estas líneas desde aquí mismo:
Código:
# <CUSTOM01
# Start cron daemon
/usr/local/etc/opt/sbin/cron
# CUSTOM01>
y las pegamos en vi, damos botón derecho sobre el vi, y le damos pegar, para que se inserten las líneas ¿OK?
Cuando tengamos las líneas en el fichero volvemos al modo comando con <ESC>
5) Ahora tenemos que cambiar unas cuantas líneas del fichero (ojo, estoy usando el fichero rcS de la última versión), para lo cual os voy a poner el contenido de un trozo del fichero ANTES de editar y como debe quedar DESPUES de editar:
Código:
ANTES DE EDITAR:
/usr/sbin/httpd -h /usr/local/bin/Resource/www -p 80
#/usr/sbin/httpd -h /tmp_orig/www -p 80
CHIPSET="RTD1283"
if [ $CHIPSET = "RTD1183" ]; then
echo "RTD1183 sleep 3"
sleep 3
fi
if [ -f $DEFAULT_AP_DIR/DvdPlayer ] && [ -x $DEFAULT_AP_DIR/DvdPlayer ]; then
cd $DEFAULT_AP_DIR
if [ -f $DEFAULT_AP_DIR/RootApp ] && [ -x $DEFAULT_AP_DIR/RootApp ]; then
echo Running dvdplayer with RootApp
./RootApp DvdPlayer&
else
echo Running dvdplayer
./DvdPlayer&
fi
else
/etc/dvdplayer/script/run_tail
fi
#Nand doesn't have signature
#SIGNATURE=`dd if=/dev/mtdblock/0 bs=8 count=1`
Las líneas que comienzan por el caracter # son comentarios, yo he marcado todo lo que he añadido nuevo entre líneas:
########## <CUSTOM02
y ....
########## CUSTOM02>
Ahora os pongo en color rojo todo lo que hay que añadir
Código:
DESPUES DE EDITAR:
/usr/sbin/httpd -h /usr/local/bin/Resource/www -p 80
#/usr/sbin/httpd -h /tmp_orig/www -p 80
########## <CUSTOM02
touch /tmp/command_sender.txt
########## CUSTOM02>
CHIPSET="RTD1283"
if [ $CHIPSET = "RTD1183" ]; then
echo "RTD1183 sleep 3"
sleep 3
fi
if [ -f $DEFAULT_AP_DIR/DvdPlayer ] && [ -x $DEFAULT_AP_DIR/DvdPlayer ]; then
cd $DEFAULT_AP_DIR
if [ -f $DEFAULT_AP_DIR/RootApp ] && [ -x $DEFAULT_AP_DIR/RootApp ]; then
echo Running dvdplayer with RootApp
########## <CUSTOM02
# ./RootApp DvdPlayer&
tail -f /tmp/command_sender.txt | ./RootApp DvdPlayer&
########## CUSTOM02>
else
echo Running dvdplayer
########## <CUSTOM02
# ./DvdPlayer&
tail -f /tmp/command_sender.txt | ./DvdPlayer&
########## CUSTOM02>
fi
else
/etc/dvdplayer/script/run_tail
fi
########## <CUSTOM02
echo " " >> /tmp/command_sender.txt
########## CUSTOM02>
#Nand doesn't have signature
#SIGNATURE=`dd if=/dev/mtdblock/0 bs=8 count=1`
El último añadido:
########## <CUSTOM02
echo " " >> /tmp/command_sender.txt
########## CUSTOM02>
es para que al arrancar en vez de ir al menú vaya directamente a ver la tele, si no quieres que haga eso, no lo pongas.
Esta es la forma de enviar comandos al equipo cuando queramos, en este caso el comando es el espacio " ", pero podemos mandarle una serie de ellos, podeis ver uan lista de los comandos en: Pág 23 post #344.
6) Para terminar la edición, pulsamos <ESC> y ZZ (dos zetas mayúsculas) para guardar el fichero y salir de vi
7) Ahora vamos a crear con vi el fichero de comandos que ejecutará el cron para detener el equipo
Nos aparece un fichero en blanco, vamos a insertar el contenido, para ello ejecutamos el comando i (i minúscula) que nos pone en modo texto para insertar, copiamos estas líneas desde aquí mismo:
Código:
#!/bin/sh
echo "APAGADO:" `date -R` >> /usr/local/etc/shutdown.log
echo "#" >> /tmp/command_sender.txt
echo "O" >> /tmp/command_sender.txt
y las pegamos en vi, damos botón derecho sobre el vi, y le damos pegar, para que se inserten las líneas ¿OK?
Cuando tengamos las líneas en el fichero volvemos al modo comando con <ESC> y para terminar la edición, pulsamos ZZ (dos zetas mayúsculas) para guardar el fichero y salir de vi
Muy bien ya tenemos el fichero shutdown creado, si quieres ver coma ha quedado usa:
8) Este fichero no es ejecutable, vamos a hacer que lo sea:
Vemos como está el fichero con:
Lo hacemos ejecutable
Código:
chmod +x shutdown
Y lo volvemos a ver
¿Veis el cambio en la parte de los flags de la izquierda?, tiene que ser algo así:
Código:
-rwxr-xr-x 1 root root 139 Feb 16 16:04 shutdown
9) Ahora vamos a programar el cron para que ejecute nuestro comando, aquí va a intervenir la hora de nuestro sistema, yo lo tengo en +1 y por lo tanto si quiero que me apague a las 3 de la mañana tengo que poner a las 2, esto lo veis simplemente con el comando date para ver la hora real del sistema y "calculeis" lo que teneis que poner en el cron, ejecutais:
Código:
date
Thu Feb 17 10:28:01 CST 2011
y comparais el resultado con la hora real, para que sepais a que ateneros, el cron se ejecutará con la hora mostrada por date.
Para ver lo que hay programado en el cron se usa el comando:
Y para añadir y/o modificar algo en el cron se usa el comando:
¿Adivinais con que se editan estas entradas, EXACTO, con vi!!
Nos aparece un fichero en blanco, vamos a insertar el contenido, para ello ejecutamos el comando i (i minúscula) que nos pone en modo texto para insertar, copiamos estas líneas desde aquí mismo:
Código:
0 2 * * * /usr/local/etc/shutdown
y las pegamos en vi, damos botón derecho sobre el vi, y le damos pegar, para que se inserten las líneas ¿OK?
Cuando tengamos las líneas en el fichero volvemos al modo comando con <ESC> y para terminar la edición, pulsamos ZZ (dos zetas mayúsculas) para guardar el fichero y salir de vi
Podemos ver el contenido de nuevo con
Ahora vamos a explicar lo que significa cada campo del cron, para que lo podais modificar a vuestro gusto.
En esta página:
http://www.pantz.org/software/cron/croninfo.html
podreis ver una explicación mas exhaustiva, yo os voy a comentar cada campo rápidamente:
Código:
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 12 * 0,6 /usr/bin/find
0: Nuestro primer campo es el minuto de ejecución: 0 en este caso
2: Segundo campo, hora de ejecución las 2, como mi sistema va una hora por detrás de la hora real, en realidad se ejecutará a las 3
*: Tercer campo, día del mes, * significa todos, hay otros valores posibles, miradlo en la página
*: Cuarto campo, mes, * significa todos
*: Quinto campo, dia de la semana, * significa todos
/usr/local/etc/shutdown: Sexto campo, comando a ejecutar, en este caso nuestro comando previamente creado.
Yo acabaré poniendo una hora para cada dia de la semana, según lo que se grabe, el cron puede tener muchos comandos para ejecutar a distintas horas y de distintas formas, cada línea es un comando, pero puede haber muchas...
ADVERTENCIA! a lo mejor el cron no se ejecuta el primer día, no desespereis, se debería ejecutar al menos a partir del segundo día y siguientes. A mi siempre me ha hecho esta jugarreta...
10) Ahora vamos a ejecutar un proceso que simulará el arranque del sistema con nuestro nuevo fichero rcS. con esto intentaremos evitar cuelgues en el arranque y que tengamos que instalar el firmware de nuevo, si funciona, podremos arrancar mas tranquilamente y si no funciona, podremos volver a recuperar nuesta copia original del rcS, ¿OK?
Estamos situados en el directorio /usr/local/etc
Detenemos todos los procesos, ojo, esto "apagará" el equipo y dejará de verse, de tal forma que el único control lo tendremos desde la sesión de telnet, no hay que desconectarse de telnet bajo ningún concepto.
Ahora vereis como se detiene todo con una ristra de mensajes, comprueba que el equipo está "muerto" y no se ve nada en la pantalla, pero tiene la luz azul.
Para probar nuestro fichero ejecutamos:
Otra ristra de mensajes de arranque (mas larga), y al final el equipo tiene que arrancar perfectamente (con tranquilidad, dale su tiempo).
En cualquieer caso, pueden aparecer unos mensajes iguales cada poco tiempo que no dejan teclear nada, no te preocupes es normal.
Si el equipo ha arrancado bien, significa que tu fichero rcS es válido, si no, hay que volver a la versión original.
Código:
SI EL EQUIPO NO ARRANCA:
Páralo de nuevo tecleando:
stopall y <RETORNO>
teclealo rápido entre los mensajes que aparecen, no te preocupes si lo tecleas entre ellos, algo así como:
sto
mensaje
pal
mensaje
l<RETORNO>
Ahora vamos a intentar recuperar el fichero original con
y lo volvemos a probar con
Cuando el equipo arranque (se vea el contenido en la pantalla del televisor), podemos apagarlo y arrancarlo de nuevo
Al usar el stopall, puede que el equipo se "niegue" a apagarse, en ese caso podemos desenchufarlo y volverlo a enchufar, pero siempre que nos hayamos asegurado que nuestro fichero rcS arranca perfectamente, con los pasos anteriores.
Por cierto, le he puesto un log al proceso, para que podamos ver cuando se ha ejecutado, para ello, cuando todo esté en marcha, podemos ver de vez en cuando como va todo, entrando con telnet y ejecutando:
Código:
more /usr/local/etc/shutdown.log
con eso veremos si ha funcionado el shutdown y a que hora se ha hecho.
Como es lógico yo NO he podido probar todas las combinaciones que se puedan producir, y esta es la forma de comprobarlo, pero lo mejor es que reviseis todo lo que tecleeis en el vi varias veces antes de darlo por bueno, TODO es importante, los espacios entre palabras, las mayúsculas y minúsculas, los distintos tipos de comillas, los símbolos... Lo dicho miradlo con lupa.
Como podeis ver este con este "tocho" he querido tener en cuenta todos los posibles problemas que podeis encontraros, parece mucho pero al final son cuatro cosas, pero he preferido explicaroslo (con mucho curre), en vez de poneros los ficheros y deciros copiar esto en tal sitio y andando.
Por favor, si encontrais alguna errata o algún problema decidlo cuanto antes para poder corregirlo, y si os funciona, podeis comentarlo en el foro para comprobar que funciona.
Buen trabajo, y buena suerte
Saludos