Perguntas Específicas por Função (Desenvolvedor, Administrador, DevOps)
Desenvolvedor: Como você depuraria um script de shell que falha intermitentemente sem mensagens de erro claras?
Resposta:
Eu começaria adicionando set -x no início do script para habilitar o rastreamento, que mostra os comandos e seus argumentos conforme são executados. Para uma depuração mais direcionada, eu usaria instruções echo para imprimir valores de variáveis em pontos críticos. Redirecionar o stderr para um arquivo (2> error.log) também pode ajudar a capturar erros esquivos.
Desenvolvedor: Explique a diferença entre $() e `` (crases) para substituição de comando.
Resposta:
Tanto $() quanto ``(crases) realizam substituição de comando, executando um comando e substituindo-o por sua saída. No entanto, $() é geralmente preferido porque permite aninhamento sem escape complexo e é mais legível. As crases exigem o escape de crases aninhadas, tornando-as mais difíceis de gerenciar.
Desenvolvedor: Escreva um script de shell para encontrar todos os arquivos maiores que 10MB em um determinado diretório e seus subdiretórios, e depois listá-los por tamanho em ordem decrescente.
Resposta:
find /path/to/dir -type f -size +10M -print0 | xargs -0 du -h | sort -rh
Este comando usa find para localizar arquivos, xargs para passá-los para du para relatar o tamanho, e sort -rh para ordenar por tamanho legível por humanos em ordem reversa.
Administrador: Como você monitoraria o uso do espaço em disco em um servidor Linux e configuraria um alerta se ele excedesse 90%?
Resposta:
Eu usaria df -h para verificar o espaço em disco. Para automatizar alertas, eu escreveria um script que analisasse a saída do df, verificasse a porcentagem para partições críticas e, em seguida, usaria mail ou uma API de mensagens (como um webhook do Slack) para enviar um alerta se o limite fosse ultrapassado. Este script seria agendado via cron.
Administrador: Descreva os passos para automatizar um backup diário de um diretório específico para um servidor remoto usando SSH.
Resposta:
Primeiro, garanta que a autenticação baseada em chave SSH esteja configurada entre os servidores de origem e destino para evitar prompts de senha. Em seguida, use rsync -avz /source/dir/ user@remote:/destination/dir/ dentro de um script de shell. Agende este script para ser executado diariamente usando um job cron, garantindo o registro adequado e o tratamento de erros.
Administrador: Qual é o propósito do arquivo /etc/fstab e quais são os problemas comuns que você pode encontrar com ele?
Resposta:
/etc/fstab define sistemas de arquivos estáticos a serem montados no momento da inicialização. Problemas comuns incluem caminhos de dispositivo incorretos, tipos de sistema de arquivos errados ou opções de montagem inválidas, que podem levar a falhas de inicialização ou partições não montadas. O uso de nofail pode prevenir problemas de inicialização para montagens não críticas.
DevOps: Como você garante a idempotência em seus scripts de shell para provisionamento de infraestrutura?
Resposta:
Idempotência significa que executar um script várias vezes produz o mesmo resultado que executá-lo uma vez. Eu consigo isso verificando a existência de recursos antes de criá-los (por exemplo, if [ ! -f /path/to/file ]; then ... fi). Para instalações de pacotes, eu uso gerenciadores de pacotes que lidam com idempotência (por exemplo, apt install -y package só instala se não estiver presente). Ferramentas de gerenciamento de configuração como Ansible ou Puppet fornecem idempotência inerentemente.
DevOps: Explique como você usaria um script de shell em um pipeline CI/CD para implantar um aplicativo.
Resposta:
Em um pipeline CI/CD, um script de shell normalmente lidaria com tarefas como buscar artefatos, parar serviços existentes, implantar novo código (por exemplo, copiar arquivos, extrair arquivos compactados), executar migrações de banco de dados e iniciar serviços. Ele incluiria tratamento de erros e registro, muitas vezes interagindo com comandos systemctl ou docker. Variáveis de ambiente seriam usadas para configuração.
DevOps: Quais são algumas melhores práticas para escrever scripts de shell robustos e de fácil manutenção em um ambiente de equipe?
Resposta:
Melhores práticas incluem usar set -euo pipefail para tratamento de erros, adicionar comentários, usar funções para modularizar o código, convenções de nomenclatura consistentes, validar entradas e fornecer instruções de uso claras. Controle de versão, ferramentas de linting (como ShellCheck) e testes completos também são cruciais para colaboração em equipe e manutenibilidade.
DevOps: Como você lidaria com segredos (por exemplo, chaves de API, senhas) em scripts de shell em um contexto CI/CD?
Resposta:
Segredos nunca devem ser codificados diretamente. Em CI/CD, eu usaria variáveis de ambiente fornecidas pela plataforma CI/CD (por exemplo, credenciais Jenkins, variáveis do GitLab CI/CD). Para cenários mais sensíveis ou complexos, eu me integraria a um sistema de gerenciamento de segredos como HashiCorp Vault ou AWS Secrets Manager, recuperando segredos em tempo de execução em vez de armazená-los em scripts ou repositórios.