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.539 ]

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

Cable modem no Mandrake 10

Bind9 slave em chroot no Debian Lenny

FreeRADIUS - Conceitos Básicos - Parte II

Tint2 - Split TaskBar com Dual Monitor

Exherbo Linux: sacrificando a cabra

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts