Introdução
É o terceiro dia na LabEx Corporation, e um desastre atingiu o Projeto Phoenix! Ao chegar ao escritório, você encontra Sarah Chen e a equipe de desenvolvimento em uma situação de crise. A aplicação que você ajudou a organizar ontem apresentou erros críticos durante sua primeira grande fase de testes.
Alertas de emergência estão inundando os sistemas de monitoramento, os usuários relatam falhas na aplicação e o pipeline de implantação parou completamente. Sarah olha para você, desesperada: o engenheiro sênior de DevOps está doente, e o prazo do projeto está se aproximando rapidamente.
"Precisamos do nosso melhor investigador neste caso", diz Sarah, entregando o relatório do incidente. "Sua abordagem sistemática para organizar nossos arquivos foi exatamente o que precisávamos. Agora precisamos desse mesmo raciocínio metódico para resolver este mistério."
Sua missão é investigar profundamente o servidor do Projeto Phoenix, analisar logs e arquivos de configuração e descobrir a causa raiz dessas falhas. Você usará ferramentas avançadas de linha de comando do Linux para reunir as pistas e restaurar a estabilidade da aplicação que sua equipe trabalhou tanto para criar. O futuro do Projeto Phoenix — e possivelmente sua carreira na TechNova — depende das suas habilidades de detetive!
Revisando o Conteúdo do Arquivo de Log da Aplicação
Seu primeiro passo como investigador é verificar o arquivo de log da aplicação do Projeto Phoenix. A aplicação grava seus logs em ~/project/logs/app.log. Uma grande quantidade de mensagens pode ser difícil de analisar, portanto você precisa encontrar rapidamente as mensagens de erro críticas para entender o que está acontecendo com o sistema que ajudou a organizar ontem.
Tarefas
- Filtre o arquivo
~/project/logs/app.logpara encontrar todas as linhas que contêm a palavraERROR. - Salve as linhas filtradas em um novo arquivo chamado
~/project/error_report.txt.
Requisitos
- Você deve usar uma ferramenta de linha de comando para pesquisar o arquivo.
- O arquivo de entrada da pesquisa é
~/project/logs/app.log. - A saída deve ser salva em um arquivo chamado
~/project/error_report.txt, no diretório~/project. - O arquivo de saída deve conter somente as linhas que incluem a palavra
ERROR.
Dicas
- O comando
grepé ideal para pesquisar padrões em arquivos de texto. - Para salvar a saída de um comando em um arquivo, você pode usar o operador de redirecionamento
>. Ele criará o arquivo se ele não existir ou o substituirá caso já exista.
Exemplos
Depois de filtrar o arquivo de log com sucesso, o arquivo ~/project/error_report.txt deverá conter somente as linhas de erro:
$ cat ~/project/error_report.txt
[2023-10-26 10:00:03] ERROR: Failed to process payment transaction #12345.
[2023-10-26 10:00:05] ERROR: NullPointerException at com.innovatech.Billing.process(Billing.java:101).
O arquivo deverá conter exatamente 2 linhas, ambas começando com marcas de data e hora e contendo a palavra "ERROR".
Investigando Mensagens de Inicialização do Sistema
Os erros da aplicação podem ser sintoma de um problema mais profundo relacionado ao hardware ou ao kernel. Um bom lugar para procurar esse tipo de problema é o buffer circular do kernel, que contém mensagens do processo de inicialização do sistema e das operações dos drivers.
Tarefas
- Examine as mensagens do kernel do sistema em busca de linhas relacionadas a
failouerror. - Salve essas descobertas em um arquivo chamado
~/project/boot_issues.txt.
Requisitos
- Você deve usar o comando
dmesgpara visualizar as mensagens do kernel. - A pesquisa por
failouerrordeve ignorar maiúsculas e minúsculas. - Os resultados devem ser salvos em um arquivo chamado
~/project/boot_issues.txt. - Observação: pode ser necessário ter privilégios administrativos (
sudo) para acessar as mensagens do kernel.
Dicas
- O comando
dmesgexibe as mensagens do kernel. Você pode direcionar a saída dele para outro comando usando um pipe para fazer a filtragem. - O operador de pipe
|envia a saída de um comando para a entrada de outro. - A opção
-ido comandogrepfaz com que a pesquisa ignore maiúsculas e minúsculas. - Para pesquisar vários padrões ao mesmo tempo, como
failOUerror, você pode usargrep -E 'pattern1|pattern2'. - Observação: se você encontrar um erro "Operation not permitted", tente executar o comando com
sudopara obter os privilégios necessários.
Exemplos
Depois de filtrar as mensagens do kernel com sucesso, o arquivo ~/project/boot_issues.txt deverá conter mensagens relevantes do sistema:
$ cat ~/project/boot_issues.txt
[ 0.330755] acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge.
[ 1.026520] RAS: Correctable Errors collector initialized.
[ 28.260800] kernel: [ 10.123456] my-driver: probe of 0000:00:1f.0 failed with error -2
O arquivo deverá conter mensagens do kernel com palavras como "fail" ou "error", ignorando maiúsculas e minúsculas, indicando possíveis problemas de hardware ou de drivers durante a inicialização do sistema.
Examinando o Arquivo de Configuração do Servidor Web
Nenhum problema crítico de hardware foi encontrado. O problema pode estar na configuração do servidor web. Vamos examinar o arquivo de configuração do Nginx para verificar como ele está configurado. Às vezes, configurações incorretas, como definir poucos processos de trabalho, podem causar gargalos de desempenho e levar a falhas da aplicação sob carga.
Tarefas
- Pesquise o arquivo de configuração do servidor web em
~/project/config/nginx.conf. - Encontre a linha que contém a diretiva
worker_processes. - Acrescente essa linha ao arquivo
~/project/error_report.txtcriado na primeira etapa.
Requisitos
- O arquivo de entrada é
~/project/config/nginx.conf. - Você deve acrescentar o resultado ao arquivo
~/project/error_report.txt, sem substituí-lo.
Dicas
- Você pode usar
grepnovamente para esta tarefa. - Para acrescentar a saída a um arquivo em vez de substituí-lo, use o operador
>>.
Exemplos
Depois de acrescentar a linha worker_processes ao relatório de erros existente, o arquivo ~/project/error_report.txt deverá conter as linhas de erro originais e a nova linha de configuração:
$ cat ~/project/error_report.txt
[2023-10-26 10:00:03] ERROR: Failed to process payment transaction #12345.
[2023-10-26 10:00:05] ERROR: NullPointerException at com.innovatech.Billing.process(Billing.java:101).
worker_processes 4;
O arquivo deverá conter 3 linhas no total: as 2 linhas de erro originais e 1 nova linha com "worker_processes 4;".
Comparando Arquivos de Configuração de Staging e Produção
Uma fonte comum de problemas em produção é a diferença entre os ambientes de staging e produção. Um recurso pode funcionar perfeitamente em staging, mas falhar em produção por causa de uma pequena diferença de configuração. Vamos comparar os arquivos de configuração da aplicação nos dois ambientes para identificar possíveis diferenças.
Tarefas
- Compare o arquivo de configuração de staging
~/project/config/staging/app.confcom o arquivo de configuração de produção~/project/config/production/app.conf. - Salve as diferenças em um novo arquivo chamado
~/project/config_diff.txt.
Requisitos
- Você deve usar o comando
diff. - A saída que mostra as diferenças deve ser salva em
~/project/config_diff.txt.
Dicas
- O comando
difffoi criado especificamente para comparar dois arquivos linha por linha. - A sintaxe básica é
diff file1 file2; ela mostra quais alterações precisam ser feitas em file1 para que ele fique idêntico a file2. - A ordem dos arquivos é importante!
diff A Bediff B Aexibem saídas diferentes. - Você pode redirecionar a saída de
diffpara um arquivo, assim como fez comgrep.
Exemplos
Depois de comparar os arquivos de configuração de staging e produção, o arquivo ~/project/config_diff.txt deverá mostrar as diferenças entre os dois ambientes:
$ cat ~/project/config_diff.txt
1,5c1,5
< ## Staging Configuration
< database.url=jdbc:mysql://staging-db:3306/nexus
< api.key=staging_key_abc123
< feature.flag.new_dashboard=true
< timeout.ms=3000
---
> ## Production Configuration
> database.url=jdbc:mysql://prod-db:3306/nexus
> api.key=prod_key_xyz789
> feature.flag.new_dashboard=false
> timeout.ms=5000
A saída de diff mostra quais alterações precisariam ser feitas no arquivo de configuração de staging para que ele corresponda ao arquivo de produção. As linhas que começam com < mostram o conteúdo do arquivo de staging, enquanto as linhas que começam com > mostram o conteúdo do arquivo de produção. Isso revela que o ambiente de produção usa URLs de banco de dados, chaves de API, flags de recursos e valores de tempo limite diferentes dos usados em staging.
Verificando a Consistência de Diretórios entre Servidores
A diferença de configuração é uma pista importante! Parece que o servidor de produção também pode estar sem alguns arquivos críticos que existem no servidor de staging. Isso pode ter sido causado por uma implantação malsucedida. Vamos simular essa situação comparando dois diretórios que representam as estruturas de arquivos de dois servidores diferentes.
Tarefas
- Você tem dois diretórios:
/home/labex/project/server1_files, que representa o servidor de staging, e/home/labex/project/server2_files, que representa o servidor de produção. - Compare esses dois diretórios para descobrir quais arquivos são exclusivos de
server1_files. - Salve a saída completa da comparação em um arquivo chamado
/home/labex/project/missing_files.txt.
Requisitos
- Você deve usar o comando
diffpara comparar os dois diretórios. - A saída deve ser salva em
/home/labex/project/missing_files.txt.
Dicas
- O comando
difftambém pode comparar diretórios quando você fornece caminhos de diretórios em vez de caminhos de arquivos. - Usar a opção
-rou--recursivecomdiffé uma boa prática ao comparar diretórios, pois ela compara todos os arquivos dentro deles. - O formato de saída de
diffpara diretórios informa explicitamente quais arquivos estão "Only in" determinado diretório. - Assim como na comparação de arquivos, a ordem é importante.
diff dir1 dir2mostra o que existe em dir1, mas não em dir2, enquantodiff dir2 dir1mostra o contrário.
Exemplos
Depois de comparar os dois diretórios dos servidores, o arquivo /home/labex/project/missing_files.txt deverá mostrar quais arquivos estão ausentes no servidor de produção:
$ cat /home/labex/project/missing_files.txt
Only in /home/labex/project/server1_files: asset2.js
Essa saída indica que asset2.js existe no primeiro diretório (server1_files, que representa o servidor de staging), mas está ausente no segundo diretório (server2_files, que representa o servidor de produção). Ao comparar primeiro staging e depois produção, podemos identificar facilmente os arquivos ausentes na produção, o que pode explicar algumas das falhas da aplicação.
Resumo
Excelente trabalho de investigação! Você identificou com sucesso as causas raiz das falhas críticas do Projeto Phoenix e forneceu a Sarah Chen e à equipe de desenvolvimento informações práticas para resolver os problemas.
Com sua investigação sistemática, você dominou comandos essenciais de solução de problemas:
grep: para filtrar arquivos de log e extrair informações críticas sobre erros.dmesg: para investigar problemas de hardware e do kernel no nível do sistema.diff: para comparar arquivos de configuração e identificar diferenças entre ambientes.- Pipelines de comandos e redirecionamento: para processar e documentar suas descobertas com eficiência.
Sua abordagem metódica à análise de logs salvou o Projeto Phoenix de uma falha potencialmente catastrófica. Agora, a equipe de desenvolvimento tem uma direção clara para corrigir as diferenças de configuração e os arquivos ausentes da implantação que você descobriu.
Sarah Chen ficou tão impressionada com suas habilidades de investigação que está recomendando você para uma função na área de segurança. Amanhã, você assumirá o papel de Guardião da Fortaleza para proteger a infraestrutura do Projeto Phoenix e defendê-la contra ameaças futuras!



