Use o notify-send para ser alertado de eventos em seus shellscripts e deixe-os mais amigáveis

Se você é fã de scripts que automatizam sua vida já deve ter ficado chateado com o fato de ter que manter uma janela de terminal aberta para rodar a sua ferramenta e saber a sua saída ou algum status a respeito de sua operação, mas isso é desnecessário.

Tradicionalmente estas mensagens seriam enviadas por e-mail para administrador do sistema usando algum serviço de SMTP como Exim, Postfix, ou sendmail, ou ainda em conjunto a isso elas seriam registradas em um arquivo de log para que você possa consulta-las depois.

Ambas as soluções (e-mail e log), embora funcionais para ambiente de servidores e computadores que você não tenha acesso físico frequente, para ambiente de desktop a praticidade passa longe destas soluções.

Isso porque, apesar de os computadores e os sistemas serem os mesmos, a forma de uso se distingue entre eles. Nós passamos muito mais tempo frente ao nosso computador do que a frente de um servidor físico.

Ainda que você acesse o seu servidor remotamente, na prática, você está no seu computador, então para uma rotina que rode em seu desktop, é muito mais rápido você ler uma mensagem de “pop-up” na tela avisando sobre o ocorrido, do que esperar que uma mensagem de e-mail chegue, ou que você abra o seu leitor de logs.

Para termos uma explicação prática, eu vou tomar como exercício uma rotina bem simples de backup em um desktop Linux, mas poderia ter usado qualquer outro caso onde você precise de notificações rápidas a respeito de algum evento.

Um simples script de backup

O nosso script de backup é bem simples como o que segue.

#!/bin/bash
echo "Iniciando o backup do home"
tar czf /mnt/backup/welrbraga-$(date +%Y%m%d%H%M).tgz $HOME
echo "Backup finalizado"

Veja que ele é realmente muito rudimentar e dentre suas deficiências ele não valida se o “/mnt/backup” é um disco externo a ser montado, ou se é criptografado ou se possui espaço disponível, não faz backups incrementais etc.

Entretanto, se tratando de backups, é melhor você ter uma cópia de alguma coisa, do que cópia nenhuma de coisa alguma.

Além do mais, nosso foco aqui não é backup, mas como enviar mensagens ao desktop, logo, este script atende ao propósito de ser um script de backup funcional, copiando os dados do usuário para um local remoto com data e hora e nos permite “brincar” com as mensagens exibidas por ele, que é o nosso objetivo no momento.

Sugestão: Eu já escrevi algumas coisas sobre backups. Caso se interesse é clicar aqui.

Seu script de backups rodando automaticamente pelo agente de tarefas (cron)

Considerando que você tenha escrito aqueles comandos em um arquivo e salvo em uma pasta como /usr/local/bin/meubackup.sh, você poderia adicionar um agendamento no seu sistema com o comando crontab, assim:

crontab -e

Isso abrirá o editor de textos padrão do sistema onde você deverá fazer o agendamento conforme necessidade.

Particularmente em meu desktop eu uso o seguinte agendamento:

Para que o nosso backup seja executado três vezes ao dia (as 7:10, 12:10 e 17:10) de segunda a sexta podemos usar a sintaxe a seguir:

10 7,12,17 * * MON-FRI /usr/local/bin/meubackup.sh

Sugestão: Eu já escrevi vários exemplos de uso do cron no sistema Linux. Confiral lá.

Se você rodar este script ou tem algo parecido com isso, certamente já notou que as “belas mensagens de início e fim de backup” não são exibidas em lugar algum quando o seu script é invocado pelo cron.

Isso ocorre porque as rotinas assim chamadas não possuem um terminal para exibir as mensagens que ele normalmente emite.

Como disse antes, usar um serviço de SMTP para enviar as mensagens de inicio é termino do backup pode ser uma opção válida em um sistema que você não tenha acesso físico constante como um servidor, por exemplo, mas se for no seu desktop de trabalho, é mais eficiente a mensagem “pipocar” na sua tela avisando sobre o evento, certo?

Instalando e testando o notify-send

Para fazer isso nós usamos o comando “notify-send” que faz parte do pacote “libnotify-bin” nas distribuições baseadas em Debian (provavelmente em outas distribuições tenham nome parecido). Então para instalá-la use o método trivial

sudo apt install libnotify-bin

Para testar se o notify-send está funcionando digite o seguinte comando no seu terminal.

notify-send -i info "OLA" "Usuario notificado com sucesso"

Você verá uma notificação na bandeja do seu sistema, conforme ele esteja configurado para exibir isso. No Gnome por exemplo, é exibida no topo da tela, em outros ambientes isso pode ocorrer no canto inferior ou superior direito.

Fig 1: Mensagem enviada a partir do notify-send no ambiente Gnome

Ícones!?

Observe o parâmetro “-i” que usei no exemplo. Ele indica o ícone a ser usado na mensagem e há vários a serem escolhidos.

Para conhecê-los navegue até a pasta “/usr/share/icons/gnome/32×32” usando um gerenciador de arquivos e escolha o ícone mais apropriado, usando apenas o nome do arquivo (sem extensão e sem o nome da subpasta onde ele esteja).

Experimente substituir o “info” por “computer-fail”, “error”, “face-sad”, “face-smile” etc.

Melhorando o nosso script de backup

Agora, antes de substituir todos os “echo” do nosso script por “notify-send”, só é preciso saber mais um detalhe: Em sistemas Linux você pode ter diversos servidores gráficos rodando mesmo tempo e por vários usuários distintos. então quando você invoca o comando notify-send pela linha de comandos, você está dentro de um ambiente gráfico já estabelecido e conhecido, no entanto ao rodar pelo cron ou outro meio isso pode não ser identificado corretamente.

Então, para que tudo ocorra como esperado o segredo é declarar uma variável de ambiente “XDG_RUNTIME_DIR” com o id do seu usuário. Esta variável faz com que o notify-send saiba exatamente o destinatário da mensagem e a exiba no lugar certo. Como segue abaixo:

XDG_RUNTIME_DIR="/run/user/$(id -u)"
export XDG_RUNTIME_DIR

Se você colocar estas duas linhas no início do seu script de backup, isso será suficiente para invocar o notify-send sem problemas e com isso o nosso exemplo de script apresentado lá no começo ficaria assim:

#!/bin/bash

XDG_RUNTIME_DIR="/run/user/$(id -u)"
export XDG_RUNTIME_DIR

notify-send -i face-cool "Iniciando o backup do home"
tar czf /mnt/backup/welrbraga-$(date +%Y%m%d%H%M).tgz $HOME
notify-send -i face-cool "Backup finalizado"

Observe que é o mesmo script apresentado lá no começo porém eu troquei os comandos “echo” por “notify-send”, além de declarar a variável XDG_RUNTIME_DIR, como mencionado antes.

Pronto! Agora ao invés do script inciar e terminar sem qualquer aviso, todas vezes que o meu backup for iniciado e terminado eu receberei um pop-up na tela notificando.

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.