Aprendendo a melhorar os seus scripts

Qual é o processo de pensamentos que leva uma pessoa a criar um script para fazer tarefas longas e cansativas em tarefas simples e rápidas? Nesse artigo eu quero levar você para dentro do cérebro de um criador de scripts para que você possa pensar como um programador e criar os seus próprios scripts de uma forma eficaz e elevar o nível para avançado. Caso você seja um novato e tem medo do terminal, esse artigo pode mudar o seu ponto de vista e te dar coragem para criar seus próprios scripts.

[ Hits: 2.068 ]

Por: M4iir1c10 em 15/05/2020 | Blog: https://github.com/mauricioph


Procurar, procurar e procurar comandos



Muito bem, agora que já podemos preencher a variável com um comando que sempre vai mudar quando o servidor tiver uma nova versão, vamos procurar informar o nosso script qual é a versão atual que temos instalada no nosso sistema.

- "Pô Maurício, é fácil né?... a versão é a 4.4.2.0, é só escrever isso na variável..."

- Não pequeno Jedi, uma variável muda, isso quer dizer que a melhor forma de escrever ela não é à mão e sim com um comando que busca este valor.

Sabemos que o servidor já esta instalado, agora temos que perguntar onde ele está instalado? Quais são as pastas que contém os arquivos de configuração e outros que o sistema pode consultar para saber qual é a versão dele mesmo?

Para descobrir onde os programas estão instalados no Linux, um comando excelente é o whereis:

whereis emby-server
emby-server: /etc/emby-server.conf /opt/emby-server/bin/emby-server

Caso você não tenha ele instalado, o resultado deste comando será:

emby-server:

O binário do servidor está em /opt e a configuração em /etc, podemos abrir a configuração para dar uma olhada.

O diretório padrão para os arquivos é /var/lib/emby.

Procurar um arquivo dentro desta pasta manualmente é loucura, eu tenho na minha instalação mais de 40 mil arquivos dentro desta pasta. Por tanto, vamos procurar onde a versão do sistema pode aparecer, arquivos de log.

find /var/lib/emby -iname "*.log"

Não retorna nada... hum... outra opção seria procurar em arquivos de texto. Porque como o log é um arquivo de texto, é muito comum encontrar programadores que invés de salvar como .log, salvam como .txt:

find /var/lib/emby -iname "*.txt"
/var/lib/emby/cache/thumbnail-failures.txt
/var/lib/emby/cache/tvdb/time.txt
/var/lib/emby/cache/ffmpeg/version_4.4.2.0.txt
/var/lib/emby/cache/ffmpeg/filters_4.4.2.0.txt
/var/lib/emby/cache/ffmpeg/protocols_4.4.2.0.txt
/var/lib/emby/cache/ffmpeg/decoders_4.4.2.0.txt
/var/lib/emby/cache/ffmpeg/encoders_4.4.2.0.txt
/var/lib/emby/cache/ffmpeg/hwaccels_4.4.2.0.txt
/var/lib/emby/logs/embyserver.txt
/var/lib/emby/logs/hardware_detection-63724827071.txt
/var/lib/emby/logs/embyserver-63724827062.txt
/var/lib/emby/logs/embyserver-63724824148.txt
/var/lib/emby/logs/embyserver-63724924800.txt
/var/lib/emby/logs/hardware_detection-63724824158.txt
/var/lib/emby/logs/ffmpeg-transcode-3384ea64-b008-406e-99e8-abad83f67062_1.txt
/var/lib/emby/data/channels.txt
/var/lib/emby/data/lastversion.txt
/var/lib/emby/data/connect.txt
/var/lib/emby/data/device.txt


- Hum, agora vemos uns arquivos interessantes... ei, olha /var/lib/emby/logs/embyserver.txt ali, deve ter com certeza a versão instalada... EPA!!! olha mais abaixo, /var/lib/emby/data/lastversion.txt, será que a informação da última versão está lá também?

- Sim pequeno Jedi... eu já consigo ver o sorriso no rosto dos minimalistas que gritavam na página anterior. Isso quer dizer que o resultado de todo o nosso exercício na página anterior está escrito ali no nosso próprio servidor, mas mesmo assim eu escrevi aqui porque essa é a jornada.

Amigo leitor, eu sei que você deve estar bravo também ou frustado por ter que ler todo o processo na página anterior e descobrir que a solução é mais simples, mas vamos olhar o lado positivo. Se você não passar por isso, não adquire conhecimento que te será útil no futuro.

Durante a criação do seu script vai aprender a repetir uma tarefa de forma mais eficaz. Portanto não se apegue ao método que você usa, não fique repetindo o mesmo método sempre.

Por isso que existem APIs, módulos, bibliotecas, tudo para evitar a repetição. Mas isso é conversa para o futuro... um dia quando você for um cara experiente, volte a esta página e você vai entender isso.

Já que lendo o arquivo /var/lib/emby/data/lastversion.txt você tem o mesmo resultado alcançado na página anterior, não vamos trocar o curl + cut para usar somente o cat:

cat /var/lib/emby/data/lastversion.txt

Agora vamos voltar o nosso foco para a versão do servidor. Se você usar cat para ler /var/lib/emby/logs/embyserver.txt, vai cair para trás de tantas linhas neste log, no meu são mais de 500 mil linhas, portanto vamos procurar palavras chaves acrescentando ao cat o grep + a palavra que queremos procurar.

cat /var/lib/emby/logs/embyserver.txt | grep version

Retorna bem menos itens, no meu caso são mais de 12 mil linhas... eu sei são muitas, mas de 500 mil para 12 mil já melhorou... ;) mas ainda assim, tem muita informação. Vamos buscar por 4.4.2.0 no final para achar o número da versão que queremos.

Fazendo isso encontramos 11 mil linhas com "version: 4.4.2.0". Melhorou... mas ainda é muito... onde você colocaria a informação da versão do seu aplicativo em um log? No cabeçalho, mas se continuar usando o cat vamos ter mais de 500 mil linhas para chegar ao cabeçalho... a não ser que tenha uma ferramenta que lê só as primeiras linhas do arquivo.

- Elementar meu caro Jedi, tem o head e lá está a informação que precisamos, na primeira linha.

2020-05-13 00:00:00.013 Info App: Application version: 4.4.2.0

- Legal, vamos filtrar essa linha com head, sed, cut... - Você pergunta.

- Pequeno Jedi, porque não usar só uma ferramenta? Com o awk podemos dizer que queremos só a linha com o "Application version:" e imprimir somente o valor que queremos, contando os espaços a versão vai ficar na sétima posição, assim sendo vamos usar este comando:

awk '/Application version:/ {print $7}' /var/lib/emby/logs/embyserver.txt

Agora que temos as duas variáveis, podemos melhorar o nosso script com um "if" para somente executar se a versão instalada e a última lançada são diferentes.

#!/bin/bash

release=$(cat /var/lib/emby/data/lastversion.txt)
myversion=$(awk '/Application/ {print $7}' /var/lib/emby/logs/embyserver.txt)
 
if [ "$myversion" != "${release}" ]
then wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${release}/emby-server-deb_${release}_amd64.deb
systemctl stop emby-server
dpkg -i emby-server-deb_${release}_amd64.deb
systemctl start emby-server
fi

Você acha que acabou? Tem mais na próxima página.

Página anterior     Próxima página

Páginas do artigo
   1. Tudo começa com o problema
   2. Quebrando o processo em pequenas tarefas
   3. Primeiras linhas
   4. Procurar, procurar e procurar comandos
   5. Melhorando o script
Outros artigos deste autor

Bug afeta todas as distros

SSH Blindado - Protegendo o seu sistema de ataques SSH

5 comandos que ninguém nunca deve executar no Linux

Instalando e configurando um dock igual ao Mac Leopard no KDE

Enfeite o LILO com uma imagem de seu gosto

Leitura recomendada

Shell Script como serviço no Windows

cal2svg - brincando com shell script e arquivos vetoriais SVG

Processamento Paralelo em Shell Script - Conversão de Arquivos WAV para MP3

Ingressando estações de trabalho Ubuntu no AD com Closed In Directory

flock - Gerenciador de lockfiles

  
Comentários
[1] Comentário enviado por Mc.Eagle em 15/05/2020 - 10:57h

Uma excelente aula de script, eu já me aventurei a fazer alguns que uso diariamente, porém não tenho a "base", até comprei alguns livros sobre o assunto mas confesso que as "distrações" do dia a dia tem me distanciado do objetivo. Mas realmente está sendo uma aula esse artigo. Força e honra!

[2] Comentário enviado por mauricio123 em 15/05/2020 - 16:26h


Tá bom demais. Muito bom mesmo. Método muito bem estratégico.

___________________________________
Conhecimento não se Leva para o Túmulo.

[3] Comentário enviado por eduardo em 18/05/2020 - 13:46h

Artigo sensacional! Parabéns!
Ensinar o "caminho das pedras" não é negativo, mas necessário. É melhor aprender como se chegou à conclusão do que ter a resposta pronta :)

[4] Comentário enviado por mauricio123 em 28/05/2020 - 14:07h


[3] Comentário enviado por eduardo em 18/05/2020 - 13:46h

Artigo sensacional! Parabéns!
Ensinar o "caminho das pedras" não é negativo, mas necessário. É melhor aprender como se chegou à conclusão do que ter a resposta pronta :)


Isso é verdade! Já até estou usando esse estilo de programação. Faz diferença mesmo.



[5] Comentário enviado por absouza em 31/05/2020 - 14:41h

Ficou massa demais, método de explicação eficiente e bem didático! Top.


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