O problema é que o script não foi projetado para funcionar com o Cron. Ele usa poucas variáveis de ambiente, que não são acessíveis a partir do Cron e são diferentes, dependendo do ambiente de área de trabalho do usuário atual. Esta é a razão na qual a página pode ser descrita como outra forma de executar na inicialização . Mas é possível definir valores dessas variáveis enquanto o CronJob estiver sendo executado.
Por exemplo, quando é o ambiente de desktop padrão do Ubuntu, as palavras-chave de pesquisa devem se tornar: 'gsettings' e 'cron', então nossa pesquisa nos levará a tópicos com fio como: Background não está mudando usando gsettings do cron , onde podemos encontrar explicações adicionais como:
Se você executar o script a partir do seu próprio ambiente (por exemplo, de um terminal janela ou a partir de aplicativos de inicialização), um número de ambiente variáveis serão definidas.
cron
, no entanto, executa seu script com um limite conjunto de variáveis de ambiente.Para editar
gsettings
com sucesso decron
, você precisa definir oDBUS_SESSION_BUS_ADDRESS
variável de ambiente. Você pode fazer isso adicionando duas linhas ao seu script, conforme descrito aqui ...
Executar: Diário-Reddit-Wallpaper através do Cron via script de inicialização
Aqui, criaremos um script de inicialização, que definirá as variáveis de ambiente necessárias, dependendo do ambiente de área de trabalho escolhido (por um argumento).
1. Primeiro clonado Daily-Reddit-Wallpaper e também instala as dependências:
cd ~
git clone https://github.com/ssimunic/Daily-Reddit-Wallpaper.git
cd ~/Daily-Reddit-Wallpaper
sudo apt-get install python-pip
pip install -r requirements.txt
2. Crie o arquivo de script - change_wallpaper_reddit.sh :
cd ~/Daily-Reddit-Wallpaper
touch change_wallpaper_reddit.sh
chmod +x change_wallpaper_reddit.sh
nano change_wallpaper_reddit.sh
O conteúdo do script é:
#!/bin/sh
# Reference: https://askubuntu.com/a/911958/566421
# Set the script home directory:
SHOME=Daily-Reddit-Wallpaper
# Set the output folder in the home directory to save the Wallpapers to:
DIR=Pictures/Wallpapers
# Set the --time parameter value
TIME=now
# Check if the Desktop Environment is changed:
LAST=$(cat "$HOME/$SHOME/last-desktop-environment.log")
if [ "" != "$LAST" ]
then
# Get the name of the last saved wallpaper image:
IMG=$(ls -Art $HOME/$DIR | tail -n 1)
rm $HOME/$DIR/$IMG
fi
# Desktop Environment cases:
if [ -z ${1+x} ] || [ "" = "gnome" ] || [ "" = "unity" ]
then
# Set the necessary environment variables - PID=$(pgrep gnome-session -u $USER) - UBUNTU/UNITY/GNOME:
export GNOME_DESKTOP_SESSION_ID=true
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep gnome-session -n)/environ | cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "" = "kde" ]
then
# Set the necessary environment variables - KUBUNTU/PLASMA/KDE:
export KDE_FULL_SESSION=true
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep startkde -n)/environ | cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "" = "mate" ]
then
# Set the necessary environment variables - Ubuntu MATE/MATE:
export DESKTOP_SESSION=mate
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep mate-session -n)/environ | cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "" = "lxde" ]
then
# Set the necessary environment variables - type 'echo $DISPLAY' to find your current display - LUBUNTU/LXDE:
export DESKTOP_SESSION=Lubuntu
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep lxsession -n)/environ | cut -d= -f2-)
export DISPLAY=$(w $(id -un) | awk 'NF > 7 && ~ /tty[0-9]+/ {print ; exit}')
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "" = "xfce4" ]
then
# Set the necessary environment variables - XUBUNTU/XFCE4:
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep xfce4-session -n)/environ|cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
# Get the name of the last saved wallpaper image:
IMG=$(ls -Art $HOME/$DIR | tail -n 1)
# Since 'change_wallpaper_reddit.py' doesn't work properly with xfce4 we shall set the background manually:
xfconf-query --channel xfce4-desktop --property /backdrop/screen0/monitor0/workspace0/last-image --set $HOME/$DIR/$IMG
# Property list: xfconf-query --channel xfce4-desktop --list
# Current settings: xfconf-query -c xfce4-desktop -p /backdrop -lv
# Set 'zoomed' style: xfconf-query --channel xfce4-desktop --property /backdrop/screen0/monitor0/workspace0/image-style --set 5
# References: https://sobrelinux.info/questions/19093/xubuntu-how-to-set-the-wallpaper-using-the-command-line"Wrong argument. It must be:"
echo " - empty (default) = gnome = unity"
echo " - kde"
echo " - lxde"
echo " - mate"
echo " - xfce4"
fi
# Save current value of the Desktop Environment variable:
echo "" > "$HOME/$SHOME/last-desktop-environment.log"
Este script tem um argumento , que determina seu comportamento dependendo do ambiente de área de trabalho escolhido (de você) (DE). Os valores possíveis são:
-
gnome
ouunity
ouempty
(padrão) - quando você usa o DE padrão do Ubuntu; -
kde
- quando você usa o KUbuntu DE; -
lxde
- quando você usa LUbuntu DE; -
mate
- quando você usa o Ubuntu MATE DE; -
xfce4
- quando você usa o XUbuntu DE.
Você também pode personalizar esses parâmetros iniciais:
-
SHOME=
define a pasta onde o Daily-Reddit-Wallpaper está localizado no seu sistema. -
DIR=
define a pasta de saída no diretório inicial para salvar os Papéis de parede - o valor padrão (Pictures/Wallpapers
) é usado no script acima. -
TIME=
define o valor do parâmetro--time
dechange_wallpaper_reddit.py
.
3. Crie CronJob ( crontab -e
), que executa change_wallpaper_reddit.sh
(a cada hora, por exemplo):
-
Se você usar o DE padrão do Ubuntu, este CronJob pode ser:
0 * * * * /home/<your user name>/Daily-Reddit-Wallpaper/change_wallpaper_reddit.sh > /home/<your user name>/Daily-Reddit-Wallpaper/cron.log 2>&1
também esta sintaxe trará o mesmo resultado:
0 * * * * /home/<your user name>/Daily-Reddit-Wallpaper/change_wallpaper_reddit.sh gnome > /home/<your user name>/Daily-Reddit-Wallpaper/cron.log 2>&1
-
Se você usa o KUbuntu DE, por exemplo, este CronJob pode ser:
0 * * * * /home/<your user name>/Daily-Reddit-Wallpaper/change_wallpaper_reddit.sh kde > /home/<your user name>/Daily-Reddit-Wallpaper/cron.log 2>&1
-
Para a solução de problemas, verifique o arquivo de log:
cat /home/$USER/Daily-Reddit-Wallpaper/cron.log
Voilà. Está funcionando!
Referências e reding adicional:
- Como programaticamente encontra o valor atual de DISPLAY quando o DISPLAY não está definido? (para uso em crontab)
- Crontab e programa C que deve ser executado em uma janela de terminal
- Ajuste o brilho com o xrandr e o cron job
- Como determinar qual é a DE do usuário atual através da CLI no SSH ou no Cron?