Developer's Toolkit: 4 ferramentas de linha de comando linux para depurar problemas do dia a dia que todos os desenvolvedores devem saber

Andy Macdonald Blocked Desbloquear Seguir Seguindo 15 de abril de 2018

Nós gastamos uma grande parte de nossas vidas depurando problemas. Às vezes, precisamos apenas de uma resposta a uma pergunta muito simples, mas obter essa resposta é uma luta real e pode ser demorada. Nas ocasiões em que vi uma parte complicada de tecnologia de terceiros lançada no problema, mas muitas vezes nesses tipos de cenários, o Linux já o cobriu. Muitos desses utilitários de linha de comando já vêm com uma distribuição linux padrão ou estão a uma linha de distância de uma instalação do gerenciador de pacotes preferido da sua distro específica. Aqui está uma lista de ferramentas de linha de comando que todos os desenvolvedores devem saber usar para responder perguntas simples.

ps

Para responder a pergunta:

O que está sendo executado na minha máquina e qual ID de processo ela possui?

Há muitas sinalizações úteis que você pode anexar ao comando, como:

 ps -ef 

Para listar todos os processos no formato unix OU:

 ps -aux 

Para listar todos os processos no formato BSD.

Você pode então usar essa lista para encontrar o PID do aplicativo desejado, por exemplo, tentando encontrar o PID de um tomcat em execução:

 ps -ef | grep tomcat 

Veja alguns exemplos de saída:

 andy @ desktop: ~ $ ps -ef | grep tomcat 
andy 19822 1590 99 14:08 pts / 1 00:00:06 / usr / lib / jvm / java-8-oracle / bin / java -Djava.util.logging.config.file = / home / andy / tomcat / apache -tomcat-7.0.56 / conf / logging.properties -Djava.util.logging.manager = org.apache.juli.ClassLoaderLogManager -XX: MaxPermSize = 512m -Xmx2048m -Dcom.sun.management.jmxremote.port = 9012 -Dcom .sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false -Djava.endorsed.dirs = / home / andy / tomcat / apache-tomcat-7.0.56 / endossado -classpath / home / andy / tomcat / apache-tomcat-7.0.56 / bin / bootstrap.jar: /home/andy/tomcat/apache-tomcat-7.0.56/bin/tomcat-juli.jar -Dcatalina.base = /home/andy/ tomcat / apache-tomcat-7.0.56 -Dcatalina.home = / home / andy / tomcat / apache-tomcat-7.0.56-Djava.io.tmpdir = / home / andy / tomcat / apache-tomcat-7.0.56 / temp org.apache.catalina.startup.Bootstrap start
andy 19848 7377 0 14:08 pts / 1 00:00:00 grep --color = tomcat auto

Aqui eu posso ver um processo em execução com um PID de 19822

Nota: Você também verá seu grep nesta saída (o PID de 19848 ).

netstat

Para responder a pergunta:

O que está sendo executado na minha máquina e em qual porta?

Se eu quiser determinar o que está escutando na porta 8000:

 sudo netstat tulpn | grep 8000 

Aqui está uma explicação do significado das diferentes bandeiras – mais pode ser encontrado com netstat --help :

 -t # portas tcp 
-u # portas udp
-l # apenas portas de escuta
-p # output PIDs
-n # resolve nomes de hardware

E se eu tiver algo em execução nesta porta, recebo algo ao longo das linhas da seguinte saída:

 andy @ desktop: ~ $ netstat -tulpn | grep 8000 
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 16740 / node

Permitindo-me kill <pid> ou inspecionar o processo que está sendo executado conforme necessário.

tcpdump

Para responder a pergunta:

De que solicitações / pacotes estão vindo e para meus aplicativos?

Se eu estiver interessado nos pedidos e pacotes vindos de e para a porta 8080, posso obter um despejo completo do tráfego, solicitações e corpo da mensagem com este comando:

 sudo tcpdump -A -s 0 -i lo porta 8080 

-i é o nome da interface. lo é a interface de loopback e todo o tráfego proveniente de sua máquina passará por essa interface de rede.

-A irá depurar e omitir alguns caracteres estranhos.

-s 0 irá imprimir todos os pacotes, pois o tcpdump não faz isso por padrão.

Veja alguns exemplos de saída mostrando uma solicitação POST simples para um aplicativo que executa um redirecionamento autenticado simples com uma combinação de nome de usuário e senha:

 13: 49: 04.701180 IP6 (rótulo de fluxo 0x8a77f, hlim 64, cabeçalho seguinte TCP (6) comprimento de carga útil: 817) ip6-localhost.52870> ip6-localhost.http-alt: Sinalizadores [P.], cksum 0x0339 (incorreto - > 0x3fa7), seq 1861: 2646, ack 2002, win 1373, opções [nop, nop, TS val 4948070 ecr 4947571], tamanho 785: HTTP, tamanho: 785 
POST / login /? SessionId = 941b5ac4-5524-4b43-b4b1-b9e371a7f212 HTTP / 1.1
Anfitrião: localhost: 8080
Conexão: keep-alive
Content-Length: 49
Aceite: * / *
Origem: http: // localhost: 8080
X-solicitado-com: XMLHttpRequest
User-Agent: Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, como o Gecko) Chrome / 64.0.3282.119 Safari / 537,36
Tipo de Conteúdo: application / x-www-form-urlencoded; charset = UTF-8
Referer: http: // localhost: 8080 / login /? Redirect = / myApp
Accept-Encoding: gzip, deflate, br
Accept-Language: en, en-GB; q = 0,9
Cookie: sessionId = 941b5ac4-5524-4b43-b4b1-b9e371a7f212;

nome de usuário = nome de usuário e senha = senha [! http]

Há muitos outros sinalizadores adicionais que você pode adicionar ao comando, como monitorar mais de uma porta:

 sudo tcpdump -A -s 0 -i lo porta 8080 ou porta 8000 

Ou capturar pacotes apenas de um único host:

 sudo tcpdump -A -s 0 -i lo porta 8080 e host src 1.2.3.4 

telnet

Para responder a pergunta:

Existe um problema de rede que me impede de me conectar ao meu recurso?

 telnet <host> <porta> 

Aqui está um exemplo de saída – não tenho processos ativos em execução e escutando na porta 8000 em minha máquina local, portanto não consigo me conectar a eles:

 andy @ desktop: ~ $ telnet localhost 8000 
Tentando 127.0.0.1 ...
telnet: Não é possível conectar-se ao host remoto: Conexão recusada

Digamos, por exemplo, que estou tentando determinar se posso me conectar a uma instância remota de postgres na minha rede, já sei que a instância está ativa e não há problemas de rede – já sei o nome do host e sei que o postgres escuta o TCP 5432 :

 andy @ desktop: ~ $ telnet myRDSinstance.eu-west-1.rds.amazonaws.com 5432 
Tentando 172.20.15.200 ...
Conectado ao myRDSinstance.eu-west-1.rds.amazonaws.com.
O personagem de fuga é '^]'.

Eu receberei uma mensagem que mostre que fiz uma conexão TCP com meu recurso. Ou se eu não conseguir conectar, veremos algo semelhante à seguinte mensagem:

 andy @ desktop: ~ $ telnet myRDSinstance.eu-west-1.rds.amazonaws.com 5432 
Tentando 172.20.15.200 ...
telnet: Não é possível conectar-se ao host remoto: Conexão recusada

Dando-me evidências para sugerir problemas de conectividade de rede como o culpado pelo meu problema específico.

Texto original em inglês.