Cron não é capaz de mudar com sucesso o plano de fundo

6

Estou executando o 12.04 com um plano de fundo XML personalizado (modificação no Dia do Ubuntu) que muda com base na hora do dia. Percebi que há um atraso significativo entre o momento em que as alterações estão agendadas para o arquivo XML e quando elas realmente aparecem em segundo plano. Eu também notei que quando eu retomo da suspensão eu também não obtenho a imagem de fundo correta. Descobri que pedalar o papel de parede manualmente resolverá isso e escrevi um script para automatizar o processo.

Se eu executar o script manualmente, ele funcionará bem. No entanto, quando eu agendar o script para ser executado no cron, o cron não altera o plano de fundo. Para ter certeza de que o script estava sendo executado corretamente pelo cron, eu criei um diretório em minha pasta pessoal depois de executar a mudança de segundo plano, e o diretório foi criado com sucesso, então sei que o cron está executando e executando o script.

Meu script:

#!/bin/bash

sleep 5
gsettings set org.gnome.desktop.background picture-uri
file:///home/zak/Pictures/Wallpaper/DOU2.xml
sleep 1
gsettings set org.gnome.desktop.background picture-uri 
file:///home/zak/Pictures/Wallpaper/DOU.xml
sleep 1
mkdir /home/zak/iscronworking

exit

O cron não consegue acessar gsettings ? O trabalho está no meu usuário crontab, então ele não deve estar rodando como root.

    
por Solenoid 21.05.2012 / 18:35

3 respostas

8

Aparentemente, gsettings precisa de algumas variáveis a serem definidas. Como o CRON usa apenas um conjunto muito restrito de variáveis de ambiente, você deve defini-las antes do script. Use o seguinte código na sua linha CRON.

30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh

No exemplo, o trabalho é definido para ser executado a cada 2 horas no 30º minuto. Eu tentei inserir as variáveis no script, para uma linha mais limpa, sem resultado, se alguém encontrar uma maneira de fazer isso, avise-nos.

Tropeçou com essas configurações nos fóruns do ArchLinux .

A solução acima não funciona mais com Vivid .

A melhor maneira de fazer isso funcionar é, de fato, encontrar DBUS_SESSION_BUS_ADDRESS variable, no script a seguir estou usando um for loop para fazer o trabalho porque use pidof de um aplicativo específico como gnome-session nem sempre funciona para mim e os aplicativos newers têm um DBUS ADDRESS diferente provavelmente porque, no meu caso particular, estou iniciando alguns daemons na inicialização com o meu nome de usuário. Para alterar efetivamente o papel de parede que estou usando dconf , você também pode usar gsettings . Então ajuste o script ao seu caso de uso.

#!/bin/bash -e
user=$(whoami)

fl=$(find /proc -maxdepth 2 -user $user -name environ -print -quit)
while [ -z $(grep -z DBUS_SESSION_BUS_ADDRESS "$fl" | cut -d= -f2- | tr -d '
0 */2 * * * /path/to-above-script.sh /path/to-wallpapers/
0' ) ] do fl=$(find /proc -maxdepth 2 -user $user -name environ -newer "$fl" -print -quit) done export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS "$fl" | cut -d= -f2-) if [ $# -gt 0 ] then PICS_PATH=$1 else PICS_PATH="/home/public/Pictures/Wallpaper/" fi IMG=$(find -L $PICS_PATH -name "*.jpg" -o -name "*.png" | shuf -n1) #gsettings set org.gnome.desktop.background picture-uri "file://${IMG}" dconf write "/org/gnome/desktop/background/picture-uri" "'file://${IMG}'" echo -e "$(date): ${IMG}" >> /tmp/wallch.log

no crontab adicione a seguinte linha para mudar o papel de parede a cada hora

30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh
    
por perdigueiro 10.10.2012 / 12:17
7

Isso acontece porque o cron usa apenas um conjunto muito restrito de variáveis de ambiente. A única variável de ambiente responsável por executar corretamente o script a partir da pergunta, quando definida como uma tarefa agendada, é DBUS_SESSION_BUS_ADDRESS , não DISPLAY ou GSETTINGS_BACKEND ou qualquer outra coisa.

Portanto, você deve exportar a variável de ambiente DBUS_SESSION_BUS_ADDRESS em seu script. Veja mais explicações na minha resposta aqui .

No final, seu script deve se parecer com:

#!/bin/bash

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

sleep 5
gsettings set org.gnome.desktop.background picture-uri file:///home/zak/Pictures/Wallpaper/DOU2.xml
sleep 1
gsettings set org.gnome.desktop.background picture-uri file:///home/zak/Pictures/Wallpaper/DOU.xml
    
por Radu Rădeanu 30.10.2013 / 09:15
0

Comecei a ter o mesmo problema há cerca de um mês. Eu também criei um script que usa gsettings para alterar o plano de fundo da área de trabalho no Gnome Shell / Unity.

A execução manual desse comando atualiza imediatamente o plano de fundo da área de trabalho. Eu também uso cron para agendar a execução do meu script:

0,30 * * * * DISPLAY=:0.0 nextwall /home/serrano/Pictures/backgrounds/

Como no seu caso, o cron executa com êxito o script e o novo URI de papel de parede é definido com sucesso em gsettings . Você pode testar isso executando:

gsettings get org.gnome.desktop.background picture-uri

No entanto, o plano de fundo da área de trabalho não é atualizado quando o cron executa o script (isso costumava funcionar até cerca de um mês atrás). Curiosamente, quando clico com o botão direito na área de trabalho e seleciono "Alterar plano de fundo da área de trabalho", o plano de fundo da área de trabalho é subitamente atualizado para a imagem correta.

Portanto, por algum motivo, alterar o plano de fundo da área de trabalho do cron não aciona mais o Nautilus para atualizar o plano de fundo da área de trabalho. Eu suspeito que isso é um bug, então eu acabei de preencher um relatório de bug para esse problema: link

Por favor, clique em "Este bug afeta você?" link se você tiver o mesmo problema.

    
por Serrano 04.08.2012 / 19:48