A linha de comando é, sem dúvida, a interação mais poderosa com o computador, embora não seja tão agradável para quem está acostumado com interfaces visuais de programação.
Para a realização de atividades precisas, exatas e que exijam eficiência, a linha de comando é o meio mais adequado. Contudo, a complexidade de execução de alguns comandos é o preço a ser pago por tal eficácia nos resultados.
Para desenvolvedores web, o conhecimento das possibilidades e técnicas de linha de comando é essencial para a otimização das tarefas diárias. Neste artigo, serão apresentadas algumas ferramentas de linha de comando não tão populares, encontradas em sistemas baseados em Unix, e essenciais a qualquer desenvolvedor web.
As duas primeiras ferramentas que iremos apresentar são o Curl e wget. Estes dois utilitários possuem o mesmo objetivo: transferir o conteúdo de servidores de rede. A principal diferença é que, por padrão, o wget armazena o conteúdo em um arquivo e o Curl exibe o resultado na saída padrão.
Com o Curl é simples obter o endereço IP (via ifconfig.me):
$ curl ifconfig.me 221.83.154.254
E com o wget é simples obter o conteúdo de um arquivo:
$ wget http://cdn1.infoq.com/styles/i/logo-infoq.gif --2012-07-30 22:45:00-- http://cdn1.infoq.com/styles/i/logo-infoq.gif Resolvendo cdn1.infoq.com (cdn1.infoq.com)... 63.246.7.157 Conectando-se a cdn1.infoq.com (cdn1.infoq.com)|63.246.7.157|:80... conectado. A requisição HTTP foi enviada, aguardando resposta... 200 OK Tamanho: 4706 (4,6K) [image/gif] Salvando em: "logo-infoq.gif" 100%[========================================================================>] 4.706 --.-K/s em 0s 2012-07-30 22:45:03 (47,7 MB/s) - "logo-infoq.gif" salvo [4706/4706]
Também é possível utilizar opções mais avançadas do Curl e do wget para a realização de depuração de requisições HTTP. Há suporte à autenticação Basic HTTP e cookies, entre outras funcionalidades. Para se obter o header http de um endereço, por exemplo:
$ curl -I infoq.com HTTP/1.1 301 Moved Permanently Date: Tue, 31 Jul 2012 01:48:43 GMT Server: Apache/2.2.3 (Red Hat) Location: http://www.infoq.com/ Connection: close Content-Type: text/html; charset=iso-8859-1
Ou pode-se utilizar a opção -L para seguir redirects:
$ curl -I -L infoq.com HTTP/1.1 301 Moved Permanently Date: Tue, 31 Jul 2012 01:49:24 GMT Server: Apache/2.2.3 (Red Hat) Location: http://www.infoq.com/ Connection: close Content-Type: text/html; charset=iso-8859-1 HTTP/1.1 200 OK Date: Tue, 31 Jul 2012 01:49:24 GMT Server: Apache/2.2.3 (Red Hat) Set-Cookie: UserCookie=11f5I0mrRRPwcsbtI7Y2fcJyT8Hw4xrl; Expires=Fri, 26-Jul-2013 01:49:24 GMT; Path=/ Set-Cookie: JSESSIONID=CA98D3339760C9E049133E5444488C27; Path=/ Connection: close Content-Type: text/html;charset=utf-8
Os parâmetros necessários para o uso dos comandos, no entanto, não são tão amigáveis. Como alternativa, existe o HTTPie: (que é conhecido como "Curl para humanos"), que permite a construção de requisições HTTP através de uma sintaxe simples, tornando-se útil para testes de serviços RESTful:
$http PATCH api.example.com/person/1 X-API-Token:123 name=John email=john@example.org age:=29 PATCH /person/1 HTTP/1.1 User-Agent: HTTPie/0.1 X-API-Token: 123 Content-Type: application/json; charset=utf-8 {"name": "John", "email": "john@example.org", "age": 29}
Outra ferramenta útil é a jsonpp, que permite formatar dados JSON obtidos de um servidor HTTP:
curl -s -L http://t.co/tYTq5Pu | jsonpp
Embora existam ferramentas mais completas de testes de carga em servidores web (como o JMeter, por exemplo, de interface visual), o Siege e o Apache AB são alternativas poderosas para teste de carga com base em linhas de comando. Por exemplo, para testar o site www.infoq.com através de 10 conexões concorrentes com duração de 30 segundos cada, pode-se executar o seguinte comando:
$ siege -c10 www.infoq.com -b -t30s ** SIEGE 2.72 ** Preparing 10 concurrent users for battle. The server is now under siege... Lifting the server siege... done. Transactions: 139 hits Availability: 100.00 % Elapsed time: 29.50 secs Data transferred: 10.72 MB Response time: 2.03 secs Transaction rate: 4.71 trans/sec Throughput: 0.36 MB/sec Concurrency: 9.57 Successful transactions: 139 Failed transactions: 0 Longest transaction: 3.63 Shortest transaction: 1.53
Outra função, a fim de se obter detalhes de execução do um servidor web, por exemplo, a ferramenta top pode ser utilizada e mostra um resumo em tempo real da utilização do processador, consumo de memória e lista em detalhes os processos em execução:
$ top top - 09:45:01 up 42 days, 17:58, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 75 total, 1 running, 74 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 509424k total, 437136k used, 72288k free, 76508k buffers Swap: 262140k total, 1144k used, 260996k free, 161528k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 2732 1476 1188 S 0 0.3 0:03.80 init 2 root 20 0 0 0 0 S 0 0.0 0:00.13 kthreadd 3 root 20 0 0 0 0 S 0 0.0 0:00.70 ksoftirqd/0 4 root 20 0 0 0 0 S 0 0.0 1:08.29 kworker/0:0 5 root 20 0 0 0 0 S 0 0.0 0:00.05 kworker/u:0 6 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0
A fluência na utilização de ferramentas de linha de comando contribui, além da realização de atividades precisas, também à produtividade dos desenvolvedores, através da automação ou da otimização do trabalho realizado.
Mais informações podem ser encontradas no post de Ben Dowling (que inspirou esta publicação), ou ainda em tutoriais de introdução a linha de comando e no post de Gabriel Saldana. Sentiu falta de algum utilitário? Utilize a seção de comentários abaixo e contribua citando suas ferramentas favoritas.