sexta-feira, 8 de outubro de 2010

Crontab e Ubuntu - Mudando o wallpaper automaticamente

Uma das coisas que me fez migrar para o linux foi a possibilidade de você mesmo fazer suas próprias alterações no sistema, sem depender de aplicativos externos, que muitas vezes você sequer sabe como funciona lá no fundo.

Foi assim que aconteceu comigo. No Linux Mint (ou qualquer distribuição que incorpore o Gnome) existe uma forma de você programar o wallpaper do seu computador para se alterar de tempos em tempos. Para tanto, existe um exemplo em /usr/share/background/cosmos/ que mostra como criar uma transição entre as imagens, controlando todos os aspectos da transição. É um recurso muito legal e simples de configurar, mas não atende a minha necessidade.

Eu até gostei do recurso do live wallpaper cosmo, mas eu queria não ter de me preocupar com isso. Simplesmente jogar minhas imagens em determinada pasta e deixar o sistema escolher a imagem randomicamente.

No começo não foi fácil pensar uma forma. Procurei scripts de diversas formas diferentes, inclusive alguns que geram os arquivos de configuração necessários para montar uma apresentação como o cosmos, mas no fundo, nenhum deles me atendia.

Foi aí que lembrei de algo. Crontab...




Mas, o que é o Crontab?

Segundo a manpage do crontab...

crontab is the program used to install, deinstall or list the tables used to drive the cron(8) daemon in Vixie Cron. Each user can have their own crontab, and though these are files in /var/spool/cron/crontabs, they are not intended to be edited directly.

O que o crontab faz é simplesmente adicionar entradas de forma que o daemon cron os execute. Mas o que é o cron? O cron é um programa de agendamento de tarefas. Com ele você pode programar para ser executado qualquer coisa numa certa periodicidade ou até mesmo em um exato dia, numa exata hora. Um uso bem comum do cron é o agendamento de tarefas administrativas de manutenção do seu sistema, como por exemplo, procura por links simbólicos quebrados, análise de segurança do sistema, backup, entre outros. Estas tarefas são programadas para todo dia, toda semana ou todo mês, serem automaticamente executadas através do crontab e um script shell comum. A configuração do cron geralmente é chamada de crontab.

A utilização do crontab não é das mais intuitivas. No entanto, depois que você aprende a ordem dos parâmetros, sua utilização fica extremamente fácil. Vamos explicar. Suponhamos que você queira, por exemplo, desligar seu computador sempre às 11 horas da noite. Usando o crontab você faria assim:

Você vai digitar em um terminal o comando crontab -e, que irá abrir um editor à sua escolha. Neste editor, você adicionará a seguinte linha:


* 23 * * * shutdown -h now

Depois de editar e adicionar a linha, você salva e o daemon cron já ficará à postos para o horário designado.

Bem, esta linha diz para o daemon cron que todos os dias, às 23 horas, ele deve executar o comando shutdown -h now, que desliga a máquina. Mas, como essa informação está codificada ali no crontab? O que são aqueles asteriscos?


Simples. Cada asterisco daqueles indica um parâmetro que o cron verifica para executar o comando informado na linha. São sete campos no total:
  1. minutos
  2. horas
  3. dia do mês
  4. mês
  5. dia da semana
  6. usuário que rodará o programa (opcional)
  7. programa que será executado.

A sintaxe da linha de comando é variada, permitindo que você possa criar expressões complexas que atendam a suas necessidades. Por exemplo a linha:


*/5 * * * * uptime >> ~/performance

executa o comando uptime a cada 5 minutos. Já a linha:


* * 10,20,30 * * /usr/local/bin/backup

executa o comando de backup todo dia 10, 20 ou 30 de cada mês.


* 8-12 * * * echo "Bom dia!"

executa o comando echo em cada hora entre 8 e 12 horas da manhã.

Você também pode juntar tudo e criar scripts mais complexos, que fazem atividades em horas bem específicas, é só saber configurar.

Cron e Wallpapers do Gnome


Bem, e o que ele têm a ver com o meu problema de troca de papéis de parede? Ora, tudo! Na realidade, eu achei muito mais simples usar um script que seleciona randomicamente uma imagem dentro de uma pasta e a salva nas configurações do gconf e colocar o cron pra executar ele, sei lá, de 15 em 15 minutos.

O script em si é esse:


#Pega o path absoluto da pasta
SCRIPT=$(readlink -f $0)
BGPATH=`dirname $SCRIPT`
#Cria uma variável de ambiente com o path de uma das imagens jpg ou png da pasta, selecionadas aleatoriamente
IMAGEM="${BGPATH}$/(ls "${BGPATH}" | egrep -i ".jpg|.png" | sort -R | head -n1)"
#Seta o papel de parede com o gconftool
gconftool-2 --type string --set /desktop/gnome/background/picture_filename "${IMAGEM}"

Eu salvei ele dentro da pasta de imagens (no meu caso, /home/caeryn/Imagens/Interfacelift) com o nome trocabg.sh, dei privilégios de execução para o script (chmod +x) e em seguida configurei o crontab com a seguinte linha:


*/15 * * * * /home/caeryn/Imagens/Interfacelift/trocabg.sh

E de 15 em 15 minutos ele selecionará uma imagem png ou jpg aleatória dentro da pasta, desconsiderando quaisquer outros tipos de arquivos. Isso é muito útil, já que direto eu jogo imagens lá pra dentro e acharia um saco enorme ter de ficar executando um script pra gerar a transição a cada arquivo novo.

Uma outra idéia que você pode implementar é atualizar seu fundo de tela de acordo com alguma imagem que se altera com o tempo, como os mapas terrestes. Um exemplo de trocaimagem.sh que você poderia usar, com a mesma regra do crontab, seria esse:


rm /home/caeryn/Imagens/world.jpg
wget http://www.opentopia.com/images/cams/world_sunlight_map_rectangular.jpg -O /home/caeryn/Imagens/mundobg.jpg
gconftool-2 --type string --set /desktop/gnome/background/picture_filename "/home/caeryn/Imagens/mundobg.jpg"

Com essa técnica, se você estiver conectado à internet, seu fundo de tela irá se atualizar para a posição do sol mais atual no momento. Muito legal. Dá pra fazer com um monte de coisas, mas as que não pensamos são sempre as melhores.

Então taí. Espero que com esse exemplo vocês tenham aprendido que no Linux vc não precisa de programas para fazer coisas simples. Você só precisa saber usar o sistema.