Usando timers systemd para alterar o wallpaper da área de trabalho aleatoriamente

Olá amigos, este é meu primeiro artigo para a comunidade VOL e estou muito feliz em poder fazê-lo. Neste texto vou demonstrar como executar um script changeWallpaper.sh utilizando timers e services na inicialização do sistema para alterar o papel de parede da área de trabalho aleatoriamente.

[ Hits: 2.259 ]

Por: taidson em 03/12/2020


Introdução



Neste texto vou demonstrar como executar um script changeWallpaper.sh utilizando timers e services na inicialização do sistema para alterar o papel de parede da área de trabalho aleatoriamente.

De acordo com a Wiki do Archlinux, sistema que utilizei para elaboração deste material, em https://wiki.archlinux.org/index.php/Systemd_(Português)/Timers_(Português), timers são arquivos de unit do systemd, com extensão .timer, utilizados para controlar .services, ou seus eventos, e podem ser utilizados como substituto ao Cron, ou seja para cada arquivo .timer, existe um arquivo .service.

Criando o script changeWallpaper.sh

Você pode definir onde salvar este arquivo, apenas certifique-se de dar permissão de execução com o comando:

chmod +x changeWallpaper.sh

Neste material o diretório escolhido foi usr/bin/ por conveniência.

#!/bin/bash
#Você pode definir uma variável de ambiente WALLPAPER_PATH_DIR para seu diretório de imagens
wallpaper_dir=$WALLPAPER_PATH_DIR
#Verificando a existência de diretórios de Imagens
ver=true
if [[ -d $wallpaper_dir ]];  #verifica se a variável de ambiente foi criada e se o diretório é válido
then
  echo "#configurando dir_path com PATH do diretório $wallpaper_PATH_DIR"
  dir_path=$wallpaper_dir

elif [[ -d $HOME/.wallpapers ]]; #verifica se o diretório /home/User/.wallpapers existe e se o diretório é valido
then
  echo "# configurando dir_path com PATH diretório home/user/.wallpapers"
  dir_path=$HOME/.wallpapers

elif [[ -d $(xdg-user-dir PICTURES)/wallpapers ]];  #verifica se diretório padrão Imagens/wallpapers existe e se o diretório é valido
then
  echo "# configurando dir_path com PATH diretório home/user/Imagem/wallpapers"
  dir_path=$(xdg-user-dir PICTURES)/wallpapers

else
  ver=false #Caso nenhum diretório acima seja encontrado
  echo "Crie o diretório $(xdg-user-dir PICTURES)/wallpapers ou $HOME/.wallpapers ou configure a variável de ambiente com seguinte comando export WALLPAPER_PATH_DIR=path_para_seu_diretório"
fi

#Configurando o  wallpaper aleatoriamente
if [[ $ver = true ]]; #verifica se o diretório de imagens foi encontrado
then
  cd "$dir_path"
  #Configurando wallpaper com PATH do wallpaper
  wallpaper=$dir_path/$(find . -type f |shuf -n 1) #Seleciona um arquivo aleatoriamente no diretório $dir_path ou seus subdiretórios

  if [[ -f $wallpaper ]];  #Verifica se o arquivo wallpaper "é um aquivo valido"
  then
    echo "Configurando wallpaper $wallpaper"
    gsettings set org.gnome.desktop.background picture-uri "$wallpaper" #Utiliza o gsettings para configurar o $wallpaper como papel de parede da área de trabalho
  else
    echo "$dir_path/$wallpaper não é um arquivo válido"
  fi
fi

Criando o arquivo changeWallpaper.service

Existem vários diretórios onde você pode salvar este arquivo de acordo com o escopo de usuários do sistema, para configurar apenas para o usuário local salve no diretório /home/user/.config/systemd/user/:

[Unit]
Description=Serviço de mudança de wallpaper aleatoriamente

[Service]
Type=oneshot
Environment=DISPLAY=:0
ExecStart=changewallpaper.sh

[Install]
WantedBy=gnome-session-initialized.target #configura o serviço para ser executado na inicialização do sistema, você pode ver outras opções com o comando systemctl --user list-units --type=target

Criando o arquivo changeWallpaper.timer

Este arquivo deve estar localizado no mesmo diretório do arquivo changeWallpaper.service.

[Unit]
Description=Timer de mudança de wallpaper aleatoriamente

[Timer]
OnCalendar=*:0/5 #configura o tempo de execução
Persistent=true
Unit=change-wallpaper.service #define o serviço a ser executado

[Install]
WantedBy=change-wallpaper.service #espera a execução do serviço para inicializar novamente

Conclusão

Alguns comentários marcados com # foram adicionados aos arquivos para facilitar a compreensão do mesmo, você pode removê-los se desejar ou em caso de problemas.

Contudo, timers, services e scripts são ferramentas poderosas presentes nos sistemas Linux e devem ser utilizadas com responsabilidade.

Tio Ben já dizia.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Trazendo toda a usabilidade do GNOME 2 para o GNOME 3 do Ubuntu 11.10

VPN com servidor e cliente rodando em Linux

Servidor Internet (parte 1)

Multifuncional HP Deskjet Ink Advantage 2546 no GNU/Linux

Ubuntu Lucid Lynx - Instalação mínima (mini-iso) de 13MB

  
Comentários
[1] Comentário enviado por mauricio123 em 03/12/2020 - 22:07h


Excelente.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[2] Comentário enviado por goll72 em 15/12/2020 - 21:02h

Eu fiz uma nova versão do script, com suporte a feh:


#!/bin/bash

# Script para mudar o wallpaper
# Por nosdiat; v1.1 por goll72
# v1.1 -
# * Detecta se há imagens no diretório
# * Adiciona suporte ao feh

# Requer GSettings ou feh; e awk

# Executando o script com a variável WALLPAPER_PATH_DIR=exemplo, "exemplo" será usado para procurar por wallpapers.
# Se executar o script sem especificar $DIR, "$HOME/.wallpapers" será usado.
wallpaper_dir="${WALLPAPER_PATH_DIR:-$HOME/.wallpapers}"

# Se o diretório $HOME/.wallpapers ou o diretório que o usuário configurou não existir, "XDG-Pictures/wallpapers" será usado.
[ -d "$wallpaper_dir" ] || wallpaper_dir="$(xdg-user-dir PICTURES)/wallpapers"


# Se nenhum dos diretórios acima existir, o script morre
[ -d "$wallpaper_dir" ] || {
echo "Configure o diretório a ser utilizado."
echo "Você pode criar o diretório $HOME/.wallpapers ou $(xdg-user-dir PICTURES)/wallpapers ou configurar a variável \$WALLPAPER_PATH_DIR."
exit
}


# Testa se há pelo menos uma imagem no diretório
ok=0

file -b --mime-type "$wallpaper_dir/*" | grep "image" && ok=1

# O script morre se não há nenhum arquivo de imagem válido no diretório
[ "$ok" -eq 0 ] && { echo "Não foi encontrado nenhuma imagem em $wallpaper_dir."; exit; }


# Se estiver instalado, o feh é usado para trocar o wallpaper
[ -f /usr/bin/feh ] && { feh --bg-fill --no-fehbg --randomize "$wallpaper_dir"/* ; exit; }

# Se o feh não estiver instalado, o GSettings é usado.
# O bloco file --mime-type - | grep "image" só deixa ser escolhidos os arquivos que são imagens.
# O bloco awk ... remove o ":" que vem após o nome do arquivo quando se utiliza o comando file.
# Seleciona um arquivo aleatório
wallpaper=$(file --mime-type "$wallpaper_dir"/* | grep "image" | awk '{ print substr($1, 1, length($1)-1) }' | shuf -n 1)

# Utiliza o GSettings para configurar o wallpaper.
gsettings set org.gnome.desktop.background picture-uri "$wallpaper"

exit




Detalhe para quem ainda usa o bom e velho cron: É só adicionar
@hourly env DISPLAY=:0 XAUTHORITY="/caminho/para/.Xauthority" /local/do/script.sh

ou algo como
30 */1 * * * env DISPLAY=:0 XAUTHORITY="/caminho/para/.Xauthority" /local/do/script.sh

[3] Comentário enviado por mauricio123 em 17/12/2020 - 14:43h


Boa.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Contribuir com comentário