20 comandos Linux que todo sysadmin deveria saber

Se sua aplicação não estiver funcionando (ou você está apenas procurando por mais informações) esses 20 comandos serão úteis.

Em um mundo cheio de novas ferramentas e diversos ambientes de desenvolvimento, é praticamente uma necessidade para qualquer desenvolvedor ou engenheiro aprender alguns comandos básicos de sysadmin. Comandos e pacotes específicos podem ajudar os desenvolvedores a organizar, solucionar problemas e otimizar seus aplicativos. E quando as coisas derem errado, fornecer informações de triagem valiosas para operadores e administradores de sistemas.

Se você é um novo desenvolvedor ou quer gerenciar seu próprio aplicativo, os 20 comandos básicos de sysadmin podem ajudá-lo a entender melhor seus aplicativos. Eles também podem ajudá-lo a descrever os problemas para solução de problemas de administradores de sistema, porque um aplicativo pode funcionar localmente, mas não em um host remoto. Esses comandos aplicam-se aos ambientes de desenvolvimento Linux, contêineres, máquinas virtuais (VMs) e bare metal.

1. curl

Use este comando para testar o nó de extremidade ou a conectividade de um aplicativo para um ponto de extremidade de serviço upstream. Curl pode ser útil para determinar se o seu aplicativo pode alcançar outro serviço, como um banco de dados ou verificar se seu serviço está respondendo.

Como exemplo, imagine que sua aplicação gere um erro HTTP 500 indicando que não pode alcançar um banco de dados MongoDB:

$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR

A opção -I mostra as informações do cabeçalho e a opção -s silencia o corpo da resposta. Verificando o endpoint do seu banco de dados indica que está bem:

$ curl -I -s database:27017
HTTP/1.0 200 OK

Então qual poderia ser o problema? Verifique se o seu aplicativo pode chegar a outros lugares além do banco de dados:

$ curl -I -s https://sempreupdate.com.br
HTTP/1.1 200 OK

Parece estar tudo ok. Agora tente acessar o banco de dados. Seu aplicativo está usando o nome do host do banco de dados, então experimente isso primeiro:

$ curl database:27017
curl: (6) Couldn't resolve host 'database'

Isso indica que seu aplicativo não pode resolver o banco de dados porque o URL do banco de dados não está disponível ou o host (contêiner ou VM) não possui um servidor de nomes que ele possa usar para resolver o nome do host.

2. python -m json.tool / jq

Depois de usar o curl, a saída da chamada da API pode ser difícil de ler. Às vezes, você quer imprimir a saída JSON para encontrar uma entrada específica. O Python possui uma biblioteca JSON integrada que pode ajudar com isso. Você usa python -m json.tool para formatar o JSON. Para usar o módulo JSON do Python, utilize o pipe (‘|’) junto à saída de um arquivo JSON com o comando python -m json.tool.

$ cat test.json 
{"title":"Person","type":"object","properties":{"firstName":
{"type":"string"},"lastName":{"type":"string"},"age":
{"description":"Age in 
years","type":"integer","minimum":0}},"required":
["firstName","lastName"]}

Para usar a biblioteca Python, canalize a saída para o Python com a opção -m (módulo).

$ cat test.json | python -m json.tool 
{
     "properties": {
         "age": {
             "description": "Age in years",
             "minimum": 0,
             "type": "integer"
         },
         "firstName": {
             "type": "string"
         },
         "lastName": {
             "type": "string"
         }
     },
     "required": [
         "firstName",
         "lastName"
     ],
     "title": "Person",
     "type": "object"
}

Para uma análise JSON mais avançada, você pode instalar jq. Jq fornece algumas opções que extraem valores específicos da entrada JSON. Para imprimir formatado como o módulo Python acima, basta aplicar o jq à saída.

$ cat test.json | jq 
{   "title": "Person",
   "type": "object",
   "properties": {
     "firstName": {
       "type": "string"
     },
     "lastName": {
       "type": "string"
     },
     "age": {
       "description": "Age in years",
       "type": "integer",
       "minimum": 0
     }
   },
   "required": [
     "firstName",
     "lastName"
   ]
}

3. ls

ls lista arquivos em um diretório. Sysadmins e desenvolvedores emitem este comando com bastante frequência. Dentro do contêiner, este comando pode ajudar a determinar o diretório e os arquivos da sua imagem de contêiner. Além de procurar seus arquivos, pode ajudá-lo a examinar suas permissões. No exemplo abaixo, você não pode executar myapp por causa de um problema de permissões. Quando você verifica as permissões usando ls -l, você percebe que as permissões não têm um “x” em -rw-r-r–, que são apenas leitura e gravação.

$ ./myapp 
bash: ./myapp: Permission denied 
$ ls -l myapp 
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp

4. tail

tail exibe a última parte de um arquivo. Você geralmente não precisa de todas as linhas de log para solucionar problemas. Em vez disso, você deseja verificar o que seus registros dizem sobre o pedido mais recente para sua aplicação. Por exemplo, você pode usar o tail para verificar o que acontece nos registros quando você faz uma solicitação para o seu servidor HTTP Apache.

example_tail

A opção -f indica a opção “seguir”, que exibe as linhas de log conforme elas estão escritas no arquivo. O exemplo tem um script em segundo plano que acessa o ponto final a cada poucos segundos e o registro registra a solicitação. Em vez de seguir o log em tempo real, você também pode usar o tail para ver as últimas 100 linhas do arquivo com a opção -n.

$ tail -n 100 /var/log/httpd/access_log

5. cat

O cat concatena e imprime arquivos. Você pode usar o cat para verificar o conteúdo do arquivo de dependências ou para confirmar a versão do aplicativo que você já construiu localmente.

$ cat requirements.txt 
flask 
flask_pymongo

O exemplo acima verifica se o seu aplicativo Flask Python tem o Flask listado como uma dependência.

6. grep

grep procura padrões de arquivos. Se você estiver procurando um padrão específico na saída de outro comando, grep destaca as linhas relevantes. Use este comando para pesquisar arquivos de log, processos específicos e muito mais. Se você quiser ver se o Apache Tomcat é iniciado, você pode ficar sobrecarregado com o número de linhas. Ao filtrar essa saída com o comando grep, você isola as linhas que indicam a inicialização do servidor.

$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start 
01-Jul-2017 18:03:47.542 INFO [main] 
org.apache.catalina.startup.Catalina.start Server startup in 681 ms

7. ps

Ps mostra o status do processo. Use este comando para determinar um aplicativo em execução ou confirmar um processo esperado. Por exemplo, se você quiser verificar se há um servidor web Tomcat, você usa ps com suas opções para obter o ID do processo do Tomcat.

$ ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  2 18:55 ?        00:00:02 /docker-java-home/jre/bi
root        59     0  0 18:55 pts/0    00:00:00 /bin/sh
root        75    59  0 18:57 pts/0    00:00:00 ps -ef

Para ainda mais legibilidade, use ps e canalize-o para grep.

$ ps -ef | grep tomcat 
root         1     0  1 18:55 ?        00:00:02 /docker-java-home/jre/bi

8. env

O comando env permite que você defina ou imprima as variáveis de ambiente. Durante a solução de problemas, você pode achar útil para verificar se a variável de ambiente incorreta impede que seu aplicativo seja iniciado. No exemplo abaixo, esse comando é usado para verificar as variáveis de ambiente definidas no host do aplicativo.

$ env 
PYTHON_PIP_VERSION=9.0.1 
HOME=/root 
DB_NAME=test 
PATH=/usr/local/bin:/usr/local/sbin 
LANG=C.UTF-8 
PYTHON_VERSION=3.4.6 
PWD=/ 
DB_URI=mongodb://database:27017/test

Observe que o aplicativo está usando Python3 e tem variáveis de ambiente para se conectar a um banco de dados MongoDB.

9. top

Exibe e atualiza as informações de processo. Use esta ferramenta para determinar quais processos estão sendo executados e quanto memória e CPU eles consomem. Um caso comum ocorre quando você executa um aplicativo e ele morre um minuto depois. Primeiro, você verifica o erro de retorno do aplicativo, que é um erro de memória.

$ tail myapp.log 
Traceback (most recent call last): MemoryError

Para confirmar, use o top para determinar a quantidade de CPU e memória que sua aplicação consome. Ao emitir o comando, você observa um aplicativo Python usando a maior parte da CPU, com o uso da memória escalando e suspeitando que seja sua aplicação. Enquanto ele é executado, você usa a tecla “C” para ver o comando completo. Acontece que é sua aplicação com uso intensivo de memória (memeater.py). Quando o seu aplicativo está sem memória, o sistema o mata com um erro de falta de memória (OOM).

example_top

example_topwithc

Além de verificar seu próprio aplicativo, você pode usar o top para depurar outros processos que utilizam CPU ou memória.

10. netstat

netstat mostra o status da rede. Este comando mostra as portas de rede em uso e suas conexões recebidas. No entanto, o netstat não vem por padrão no Linux. Se você precisar instalá-lo, você pode encontrá-lo no pacote net-tools. Como desenvolvedor, testando localmente ou em um host remoto, você pode receber um erro de que uma porta já está alocada ou um endereço já está em uso. O uso do netstat com opções de protocolo, processo e porta demonstra que o servidor HTTP Apache já usa a porta 80 no host abaixo.

example_netstat

11. ip address

Se o comando ip address não funcionar no seu host, ele deve ser instalado com o pacote iproute2. O ip address mostra as interfaces e os endereços IP do host. Você usa para verificar o endereço IP do seu contêiner ou do host. Por exemplo, quando seu contêiner está conectado a duas redes, o ip address pode mostrar qual interface se conecta a qual rede. Para uma verificação simples, você sempre pode usar o comando para obter o endereço IP do host. O exemplo abaixo mostra que o contêiner da camada web possui um endereço IP 172.17.0.2 na interface eth0.

example_ipaddr_0

12. lsof

lsof lista os arquivos abertos. Em algumas imagens Linux, você precisa instalar o lsof com o pacote lsof. No Linux, quase qualquer interação com o sistema é tratada como um arquivo. Como resultado, se seu aplicativo grava um arquivo ou abre uma conexão de rede, o lsof refletirá essa interação como um arquivo. Semelhante ao netstat, você pode usar o lsof para verificar as portas de escuta. Por exemplo, se você quiser verificar se a porta 80 está em uso, você usa lsof para verificar qual processo está usando. Abaixo, você pode ver que httpd (Apache) escuta na porta 80. Você também pode usar o lsof para verificar o ID do processo do httpd, examinando onde reside o binário do servidor web (/usr/sbin/httpd).

example_lsof

O nome do arquivo aberto na lista de arquivos ajuda a identificar a origem do processo, especificamente o Apache.

13. df

Você pode usar df para solucionar problemas de espaço em disco. Quando você executa seu aplicativo em um orquestrador de contêiner, você pode receber uma mensagem de erro sinalizando a falta de espaço livre no host. Enquanto o espaço em disco deve ser gerenciado e otimizado por um sysadmin, você pode usar df para descobrir o espaço existente em um diretório e confirmar se você está realmente sem espaço.

example_df

A opção -h imprime as informações em formato legível por humanos. O exemplo acima mostra bastante espaço em disco neste host.

14. du

Para obter informações mais detalhadas sobre quais arquivos usam o espaço em disco em um diretório, você pode usar o comando du. Se você quisesse descobrir qual registro ocupa mais espaço no diretório /var/log, por exemplo, você pode usar du com a opção -h (legível por humanos) e a opção -s para o tamanho total.

$ du -sh /var/log/* 
1.8M  /var/log/anaconda 
384K  /var/log/audit 
4.0K  /var/log/boot.log 
0 /var/log/chrony 
4.0K  /var/log/cron 
4.0K  /var/log/maillog 
64K /var/log/messages

O exemplo acima revela o maior diretório em /var/log como sendo /var/log/anaconda. Você pode usar du em conjunto com df para determinar o que utiliza o espaço em disco no host.

15. id

Para verificar o usuário executando o aplicativo, use o comando id para retornar a identidade do usuário. O exemplo abaixo usa Vagrant para testar o aplicativo e isolar seu ambiente de desenvolvimento. Depois de entrar no Vagrant, se você tentar instalar o Apache HTTP Server (uma dependência), o sistema indica que você precisa executar o comando como root. Para verificar o seu usuário e grupo, emita o comando id e observe que você está executando como o usuário “vagrant” no grupo “vagrant”.

$ yum -y install httpd 
Loaded plugins: fastestmirror 
You need to be root to perform this command. 

$ id 
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) 
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Para corrigir isso, você deve executar o comando como superusuário, o que oferece privilégios elevados.

16. chmod

Quando você executa o seu binário do aplicativo pela primeira vez em seu host, você pode receber a mensagem de erro “permissão negada”. Como visto no exemplo para ls, você pode verificar as permissões do binário do seu aplicativo.

$ ls -l 
total 4 
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

Isso mostra que você não possui direitos de execução (“x”) para executar o binário. O chmod pode corrigir as permissões, permitindo que seu usuário execute o binário.

$ chmod +x test.sh 

[vagrant@localhost ~]$ ls -l 
total 4 
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

Conforme demonstrado no exemplo, isso atualiza as permissões com direitos de execução. Agora, quando você tenta executar seu binário, o aplicativo não lança um erro de negação de permissão. Chmod pode ser útil quando você carrega um binário em um contêiner também. Ele garante que seu contêiner tenha as permissões corretas para executar seu binário.

17. dig / nslookup

Um servidor de nomes de domínio (DNS) ajuda a resolver uma URL para um conjunto de servidores de aplicativos. No entanto, você pode achar que a URL não se resolve, o que causa um problema de conectividade para o seu aplicativo. Por exemplo, digamos que você tente acessar seu banco de dados na URL “mydatabase” do host do seu aplicativo. Em vez disso, você recebe um erro “não pode resolver”. Para solucionar problemas, você tenta usar o dig (DNS lookup utility) ou nslookup (consultar servidores de nome da Internet) para descobrir por que o aplicativo não consegue resolver o banco de dados.

$ nslookup mydatabase 
Server:   10.0.2.3 
Address:  10.0.2.3#53  

** server can't find mydatabase: NXDOMAIN

O uso do nslookup mostra que mydatabase não pode ser resolvido. Tentando resolver com o dig produz o mesmo resultado.

$ dig mydatabase  
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase 
;; global options: +cmd 
;; connection timed out; no servers could be reached

Esses erros podem ser causados por muitos problemas diferentes. Se você não pode depurar a causa raiz, acione seu administrador de sistema para mais pesquisas. Para testes locais, esse problema pode indicar que os servidores de nomes do seu host não estão configurados adequadamente. Para usar esses comandos, você precisará instalar o pacote BIND Utilities.

18. iptables

iptables bloqueia ou permite o tráfego em um host Linux, semelhante a um firewall de rede. Esta ferramenta pode impedir que determinados aplicativos recebam ou transmitam solicitações. Mais especificamente, se seu aplicativo tiver dificuldade em alcançar outro endereço, o iptables pode estar negando tráfego para o ponto final. Por exemplo, imagine que o host do seu aplicativo não pode alcançar o SempreUpdate.com.br. Você usa curl para testar a conexão.

$ curl -vvv sempreupdate.com.br 
* About to connect() to sempreupdate.com.br port 80 (#0) 
*   Trying 149.56.26.129... 
* Connection timed out 
* Failed connect to sempreupdate.com.br:80; Connection timed out 
* Closing connection 0 
curl: (7) Failed connect to sempreupdate.com.br:80; Connection timed out

A conexão expira. Você suspeita que algo pode estar bloqueando o tráfego, então você lista as regras do iptables com a opção -S.

$ iptables -S 
-P INPUT DROP 
-P FORWARD DROP 
-P OUTPUT DROP 
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT 
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT

As três primeiras regras mostram que o tráfego cai por padrão. As regras restantes permitem tráfego SSH e DNS. Nesse caso, acione o seu administrador de sistema se você precisar de uma regra para permitir o tráfego para pontos finais externos. Se este é um host que você usa para desenvolvimento ou teste local, você pode usar o comando iptables para permitir o tráfego correto. Tenha cuidado ao adicionar regras que permitem o tráfego para o seu host.

19. sestatus

Você geralmente encontra o SELinux (um módulo de segurança Linux) em um host de aplicativo gerenciado por uma empresa. O SELinux fornece acesso de privilégios mínimos aos processos que estão sendo executados no host, evitando que processos potencialmente mal-intencionados acessem arquivos importantes no sistema. Em algumas situações, um aplicativo precisa acessar um arquivo específico, mas pode lançar um erro. Para verificar se o SELinux bloqueia o aplicativo, use tail e grep para procurar uma mensagem “negada” no registro /var/log/audit logging. Caso contrário, você pode verificar se possui o SELinux ativado usando sestatus.

$ sestatus 
SELinux status:                 enabled 
SELinuxfs mount:                /sys/fs/selinux 
SELinux root directory:         /etc/selinux 
Loaded policy name:             targeted 
Current mode:                   enforcing 
Mode from config file:          enforcing 
Policy MLS status:              enabled 
Policy deny_unknown status:     allowed 
Max kernel policy version:      28

A saída acima indica que o host do aplicativo possui o SELinux habilitado. No seu ambiente de desenvolvimento local, você pode atualizar o SELinux para ser mais permissivo. Se precisar de ajuda com um host remoto, o seu administrador de sistemas pode ajudá-lo a determinar a melhor prática para permitir que seu aplicativo acesse o arquivo que ele precisa.

20. history

Quando você emite tantos comandos para testar e depurar, você pode esquecer os úteis! Cada shell possui uma variante do comando de histórico. Ele mostra o histórico dos comandos que você emitiu desde o início da sessão. Você pode usar o history para registrar quais comandos você usou para solucionar seu aplicativo. Por exemplo, quando você emite o histórico durante o curso deste artigo, ele mostra os vários comandos que você experimentou e aprendeu.

$ history     
1  clear     
2  df -h     
3  du

E se você quiser executar um comando em seu histórico anterior, mas você não deseja reconfigurá-lo? Use ! Antes do número do comando para re-executar.

example_history

Os comandos básicos podem melhorar a sua experiência em solução de problemas ao determinar por que seu aplicativo funciona em um ambiente de desenvolvimento, mas talvez não em outro. Muitos administradores de sistemas utilizam esses comandos para depurar problemas com sistemas. Entender alguns desses comandos de solução de problemas úteis pode ajudá-lo a se comunicar com sysadmins e resolver problemas com seu aplicativo.

Fonte OpenSource

Comentários