Como verificar o número de variáveis passadas em um shellscript?

O que mais me traz satisfação como desenvolvedor é gerar automatização de tarefas. Desenvolver ferramentas e rotinas que possibilitem que minha equipe ou meus clientes trabalhem menos para alcançar determinado objetivo.

Desde gerar backups até configurar um ambiente de desenvolvimento ou produção. Hoje fui implementar umas alterações no shellscript para criar um site no apache e criar as pastas no meu ambiente local, mas para isso precisava verificar o número de variáveis passadas pelo usuário antes de continuar a execução do script. 

Como verificar o número de variáveis passadas no shellscript?

Para ter o número de variáveis que um shelscript recebeu é bem simples:

$#

Sabendo disso basta você fazer uma comparação para validar se o número de variáveis é o que você esperava. No exemplo abaixo o script finaliza a execução se o usuário não passar pelo menos 2 variáveis:

if [ $# -lt 2 ]; then
echo 'Necessário 2 variáveis'
exit 0
fi

Uma dica do Bruno para tornar o código mais legível é fazer a comparação da seguinte forma, e também usar exit 1 para quando der erro, fica assim:

if [[ $# < 2 ]] then
echo 'Necessário 2 variáveis'
exit 1
fi

Usar o exit 1 quando algo der errado no seu script impede que outros scripts sejam executados na sequência se o seu deu errado, por exemplo:

seu_script.sh && seu_segundo_script.sh

Se algum erro acontecer no seu_script o seu_segundo_script não será executado.

Agora consigo validar a execução de qualquer shellscript e evitar erros. Se voc6e tem uma maneira diferente de fazer esta verificação deixe nos comentários!

Como limpar o cache do WordPress por linha de comando

Estou trabalhando em alguns projeto utilizando o WordPress como CMS e em situações específicas eu precisava limpar o cache de todo o site. Não sou fã da plataforma, acho que a performance deixa muito a desejar, mas não posso negar que ela é cheia de facilidades.

Sei que posso fazer apagar o cache por dentro do wp-admin, mas no ambiente de desenvolvimento ou se meu “trigger” para a limpeza de cache é externo, um caminho muito fácil é apagar fisicamente todos os arquivos de cache do WordPress.

Os arquivos de cache ficam em wp-content/cache e podem ter extensões .html, .gz e também .meta. Então com um simples find na linha de comando (unix) você consegue limpar o cache do WordPress com a linha abaixo:

find /var/www/wordpress.gssolutions.com.br/public/wp-content/cache/ \( -name '*.html' -or -name '*.html.gz' -or -name '*.meta' \) -delete

Lembre-se de substituir o caminho (/var/www/wordpress.gssolutions.com.br/public) pelo caminho da instalação do WP no seu servidor.

Tem uma solução melhor para lidar com estas situações? Deixe nos comentários 🙂

Resolvendo o problema de locale no EC2

Tenho algumas instâncias no EC2 da Amazon e todas utilizam Ubuntu Server. E todas tinham um problema com language, o que me impedia de abrir o terminal do MongoDB por exemplo, ou exibia os avisos abaixo em algumas instalações:

WARNING! Your environment specifies an invalid locale. This can affect your user experience significantly, including the ability to manage packages.

perl: warning: Setting locale failed.

perl: warning: Please check that your locale settings:

    LANGUAGE = (unset),

    LC_ALL = (unset),

    LC_CTYPE = "de_DE.UTF-8",

    LANG = "en_US.UTF-8"

    are supported and installed on your system.

perl: warning: Falling back to the standard locale ("C").

locale: Cannot set LC_CTYPE to default locale: No such file or directory

locale: Cannot set LC_ALL to default locale: No such file or directory

O problema é não ter um locale definido, eu já tentei várias coisas, a maioria dos tutorias mandava eu fazer o seguinte:

sudo locale-gen fi_FI.UTF-8
sudo dpkg-reconfigure locales

Isso, teoricamente, resolve o problema porém ele voltou acontecer em todas as instâncias, e ter que repetir o processo não é o que chamo de solução.

O que realmente resolveu meu problema foi editar o arquivo /etc/environment e adicionar a seguinte linha:

LC_ALL="en_US.UTF-8"

Agora, sempre que a instância iniciar ela terá o LC_ALL definido, resolvendo o probelma com o locale inválido.

Shellscript para configurar domínio no Apache

Quando você se torna freelancer ou empreendedor a automatização passa a ser um ponto ainda mais importante no seu dia a dia. Cada tarefa automatizada significa aumento de lucro a longo prazo, mais tempo para estudar ou descansar. 

Pensando em automatização, recomendo que você aprenda como usar o GruntJS neste ótimo artigo do Fernahhh.

Eu administro um servidor AWS para meus projetos e projeto de alguns clientes, é um Ubuntu Server com Apache. Configurar domínios, principalmente localmente no meu ambiente de desenvolvimento, se tornou uma tarefa comum e que levava alguns minutos.

A cada novo projeto que vou trabalhar (seja front-end ou back-end) eu aponto um novo domínio para meu servidor local (hosts) e crio um domínio no meu apache apontando para o repositório do projeto. 

Shellscript para automatizar a criação de domínios no Apache

Resolvi utilizar shellscript para automatizar a criação de domínios no Apache. Encontrei um script e adaptei para a minha necessidade.

Este script rece um parâmetro, que é o domínio que será criado.

Exemplo:

sh create-site andafter.org

As ações do script:

  1. Cria os diretórios para o domínio
    1. /var/www/$dominio
    2. /var/www/$dominio/public
    3. /var/www/$dominio/logs
  2. Cria um arquivo de configuração com o nome do comínio em /etc/apache2/sites-available
  3. Cria um link simbólico para ativar o domínio (sites-enabled)

create-site.sh

!/bin/bash
################
# Script for creating Virtual Servers On Apache
# Check for the correct parameters
if [ $# -eq 0 ]; then
        echo 'Você precisa passar o domínio a ser criado como parâmetro'
        echo 'Uso: create-site gssolutions.com.br'
        exit 0
fi
# Assign Variables
SITE=$1
# Create the Directory which will contain your Virtual Site
if [ ! -d /var/www/$SITE ]; then
        mkdir /var/www/$SITE
        mkdir /var/www/$SITE/public
        mkdir /var/www/$SITE/logs
fi
# Create the Config file for your virtual site
echo "<virtualhost *:80="">"> /etc/apache2/sites-available/$SITE
echo    "# Admin email, Server Name (domain name) and any aliases"  >> /etc/apache2/sites-available/$SITE
echo    "  ServerAdmin [email protected]" >> /etc/apache2/sites-available/$SITE
echo    "  ServerName $SITE" >> /etc/apache2/sites-available/$SITE
echo    "  ServerAlias www.$SITE" >> /etc/apache2/sites-available/$SITE
echo    " ">>/etc/apache2/sites-available/$SITE
echo    "  # Index file and Document Root (where the public files are located)" >> /etc/apache2/sites-available/$SITE
echo    "  DirectoryIndex index.html" >> /etc/apache2/sites-available/$SITE
echo    "  DocumentRoot /var/www/$SITE/public" >> /etc/apache2/sites-available/$SITE
echo    "  LogLevel warn" >> /etc/apache2/sites-available/$SITE
echo    "  ErrorLog  /var/www/$SITE/logs/error.log" >> /etc/apache2/sites-available/$SITE
echo    "  CustomLog /var/www/$SITE/logs/access.log combined" >> /etc/apache2/sites-available/$SITE
echo "</virtualhost>" >> /etc/apache2/sites-available/$SITE
echo    "<directory \"="" var="" www="" $site="" public\"="">" >> /etc/apache2/sites-available/$SITE
echo    "   Options Indexes FollowSymLinks" >> /etc/apache2/sites-available/$SITE
echo    "   AllowOverride All" >> /etc/apache2/sites-available/$SITE
echo    "   Order allow,deny" >> /etc/apache2/sites-available/$SITE
echo    "   Allow from all" >> /etc/apache2/sites-available/$SITE
echo    "</directory>" >> /etc/apache2/sites-available/$SITE
# Create the Sym Link to enable your Virtual Site
if [ ! -L /etc/apache2/sites-enabled/$SITE ]; then
        ln -s /etc/apache2/sites-available/$SITE /etc/apache2/sites-enabled/
fi

Se você quiser pode adicionar ao final do script o comando para dar reload nas configurações do Apache.

Ilustra do “apache” é do ~pitx

Executando comandos unix pelo PHP

Eu apliquei um sistema unificado de cache no And After, nos blogs do site e na loja Eu Compraria, este sistema tornou o Gir (nosos querido escravo-servidor) muito mais eficiente na realização de suas tarefas.

O sistema de cache utiliza o Code Igniter com memcached e cache de arquivo físico. Isso otimizou muito o carregamento de todas as nossas páginas: "(1.002 Seconds), 70% of sites are slower: segundo a Alexa.

Além de adiantar a entrega das páginas, melhorando a vida dos leitores, reduziu drasticamente o consumo (e consequentemente o custo) de servidor e eliminou os problemas de performance com com o alto consumo de processamento do MySQL (saiba as diferenças entre innoDB e MyISAM).

Automatizando a "limpeza" de cache

A única dificuldade que isto acarretou foi o trabalho de realizar a limpeza de cache de arquivos físicos quando era necessário.

Até hoje eu fazia isso via ssh: logava no servidor e removia os arquivos necessários. Eu poderia implementar um sistema do Code Igniter para fazer isso, mas envolveria percorrer todos os registros do banco e eliminar o cache referente a cada objeto.

Um modo menos custoso e trabalhoso de fazer isso é automatizar a remoção dos arquivos físicos através do próprio PHP, e uma forma de fazer isso é com o comando shell_exec.

PHP shell_exec

O comando do PHP shell_exec permite você executar algum comando do terminal unix diretamente pelo PHP, retornando como uma string qualquer coisa que este comando imprima no terminal.

Atenção: este comando pode expor seu servidor a problemas de segurança.

No meu caso eu queria apagar os arquivos físicos de cache, um exemplo de sintaxe para o meu caso:

shell_exec('rm /var/www/andafter.org/htdocs/cache/publicacoes/*');

 

Vale lembrar que seu usuário www deve ter as permissões necessárias para executar os comandos. Abriu um novo leque de possibilidades do que é possível fazer com o PHP depois de conhecer este comando. 🙂