Actualizar crontab desde crontab
martes, 25 de marzo de 2008Ya sé PERL !! que diría el de matrix.
Bueno, no es para tanto. La cosa es que quería actualizar diariamente la hora en que Motion se activa y comienza la grabación de eventos en la cámara del comedero de acuerdo a la hora en que sale y se pone el sol. Es decir, necesitaba añadir a crontab un script que cambiase un par de entradas en crontab cada 24 horas. Y la unica manera que he encontrado ha sido a través de PERL y los paquetes Config::Crontab y Weather::Com.
El primero para acceder y editar los eventos programados para Cron y el segundo para acceder a información meteorológica servida por weather.com (que, entre otras, incluye sunset y sunrise). Además este último me ha servido para incluir en la página de la cámara del comedero un pequeño informe meteorológico sobre el estado local del clima (e ir sobreaviso si el viento o la llúvia me ván a fastidiar las grabaciones).
El script es muy sencillo y es el primero (no se me tiren al cuello). Simplemente basta con instalar los dos paquetes PL mencionados y añadir a crontab el siguiente ejecutable:#!/usr/bin/perl
use Config::Crontab;
use Weather::Com::Finder;
#-----------------------------------
#consultamos puesta/salida de sol
#-----------------------------------
my $Id = 'xxxxxxxx';
my $Clave = 'yyyyyyyyy';
my %weatherargs = ('partner_id' => $Id,'license' => $Clave);
my $buscar = Weather::Com::Finder->new(%weatherargs);
my $mi_casa = $buscar->find('Cartagena, Spain');
@salida = split(/:/, $mi_casa->[0]->sunrise()->time());
@puesta = split(/:/, $mi_casa->[0]->sunset()->time());
#--------------------------------------
#leemos y editamos crontab
#---------------------------------------
my $ct=new Config::Crontab;
$ct->read;
my ($evento_activarcamara) = $ct->select(-command_re=>'motion -c');
$evento_activarcamara->hour($salida[0]); $evento_activarcamara->minute($salida[1]);
my ($evento_apagarcamara) = $ct->select(-command_re=>'kill -9 `cat motion.pid`');
$evento_apagarcamara->hour($puesta[0]); $evento_apagarcamara->minute($puesta[1]);
$ct->write;
Basicamente: la primera parte se conecta a weather.com utilizando el ID y Clave dadas por la página despues de registrarse, y obtiene sunrise y sunset que son devueltos en un formatos tal que 07:10 y 19:20
Una vez obtenidas la hora de salida y puesta del sol, pasamos a leer el contenido de nuestro crontab y buscamos el evento cuyo comando coincida con la expresión regular «motion -c» (el evento que lanza Motion es: motion -c motion.conf -p pid). Una vez obtenido le asignamos la hora y el minuto devuelto en el apartado anterior.
Idem con el evento apagarcamara (buscamos el kill -9 que mata el proceso Motion).
Voilá, cada noche crontab se actualiza solito para comenzar y detener las grabaciones de acuerdo a luz solar. Ahora solo falta que los pájaros hagan caso de este horario (no es el caso: por lo visto hasta ahora, comienzan la actividad unos 20 minutos antes de salir el sol y la detienen 20 minutos antes de ponerse, habrá que hacer ajustes.)
Matías
#1/ 12 de January/2009 a 14:43:08
Otros comentarios de «Matías»
Lindo script :)
Juan
#2/ 02 de July/2009 a 19:50:35
Otros comentarios de «Juan»
muy bueno, me parece una muy buena manera de usar perl.
Consulta, a mi cron no me ejecuta las cosas en la shell de mi user, corre el script pero no cambia el fondo de pantalla, no estoy usando perl, sino un sh, alguna idea de que puede ser???
distro-- ubuntu 9.04
lenguaje -- bash ( sh )
permisos de ejecucion todos desde mi user
gracias
Trebol-A
#3/ 02 de July/2009 a 20:50:51
Otros comentarios de «Trebol-A»
Hola juan,
pues depende del script que estes haciendo, es posible que hayas olvidado incluir en el script algunas variables de sistema para que se ejecute correctamente.
Pon al inicio de tu script algo como
echo "probando" > ~/Desktop/testeando.txt, para comprobar si el script se ejecuta pero se detiene despues.
Si lo anterior funciona (aparece en tu escritorio el archivo de texto a la hora indicada en cron), asegurate de incluir en las primeras lineas del script las variables que pueda necesitar la ejecución, por ejemplo:
export DISPLAY=:0.0
export USER=tu.ususario
export HOME=/home/$USER
, el path de JAVA, etc, etcc... vaya las rutas de los programas que estés usando.
Juan
#4/ 05 de July/2009 a 23:35:09
Otros comentarios de «Juan»
Muchas Gracias, todabia no pude hacerlo funcionar, me estoy volviendo realmente loko, pero sigo intentando, he probado lo de los PATHS y los exports, pero no he conseguido que cambie la imagen en mi sesion, lo mas loko es que el log no tiene errores y el sh se ejecuta muy bien.
Pero bueno, veremos que pasa.
Les dejo el sh para que lo prueben uds y para que se fijen si funciona:
::::SH::::
##!/bin/bash
picsfolder="/usr/share/backgrounds/"
cd $picsfolder
files=( *.jpg )
N=${#files[@]}
((N=RANDOM%N))
randomfile=${files[$N]}
echo $randomfile
A=`echo $randomfile | sed 's/^\(\w\{4\}\).*/\1/'`
if [ "$A" = "tile" ]; then
OPTION="wallpaper"
echo $OPTION
else
OPTION="streched"
echo $OPTION
fi
gconftool-2 -t str --set /desktop/gnome/background/picture_options "stretched"
gconftool-2 -t str --set /desktop/gnome/background/picture_filename $picsfolder$randomfile
##########################################
tiene permisos de ejecucion dados de esta manera-->
oke@ubuntu:/$ chmod +x /home/oke/cambio_escritorio.sh
y agregado a crontab asi --->
oke@ubuntu:/$ crontab -l
# m h dom mon dow command
* * * * * DISPLAY=:0.0 ./cambio_escritorio.sh >> resulta.log 2>&1
#fin de crontab
#####################
El tema es que no consigo que funcione para mi user, o sea, se ejecuta y me da un log, sin errores!!! pero no lo consigo ver el cambio graficamente.
Ya probe permisos users y demas, hasta desde root lo hice, cosa que no tiene sentido porque estoy en otra sesion.
Ahora si yo lo ejecuto desde el terminal, me cambia la imagen pipi cucu!! ja
Espero que lo prueben y vean que pasa por si mismos!!
Saludos cordiales!!
Trebol-A
#5/ 06 de July/2009 a 19:06:39
Otros comentarios de «Trebol-A»
Hola Juan,
no he probado el script, uso KDE no Gnome, pero yo añadiría la exportación de variables en el script, no en crontab poniendolo así:
#!/bin/bash
export DISPLAY=:0.0
export HOME=/home # <- corrige según tu sistema
export USER=$HOME/juan # <- corrige según tu usuario
picsfolder=”/usr/share/backgrounds/”
cd $picsfolder
files=( *.jpg )
N=${#files[@]}
((N=RANDOM%N))
randomfile=${files[$N]}
echo $randomfile
A=`echo $randomfile | sed ’s/^\(\w\{4\}\).*/\1/’`
if [ "$A" = "tile" ]; then
OPTION=”wallpaper”
echo $OPTION
else
OPTION=”streched”
echo $OPTION
fi
gconftool-2 -t str –set /desktop/gnome/background/picture_options “stretched”
gconftool-2 -t str –set /desktop/gnome/background/picture_filename \
$picsfolder$randomfile
Por otro lado, en la linea que apuntas de crontab deberias separar con punto y coma y probablemente incorporar la ruta absoluta a bash
DISPLAY=:0.0; /bin/bash /ruta/del/script/cambio_escritorio.sh >> resulta.log 2>&1
Nota que en la linea anterior DISPLAY no sería necesario ya que vá definido en el script.
18 de November, 2024 @ 12:34