Introdução
O Status Desk normalmente atualiza um pequeno cache a cada minuto. Um programa de envio desconhecido também manda solicitações sintéticas de treinamento ao coletor interno. Encerrá-lo parece ajudar, mas ele volta. Sua tarefa é remover o acionador recorrente preservando a atualização normal do status.
Basta saber usar o terminal. Status Server é um shell administrativo autorizado dentro do contêiner alvo, iniciado em /srv/status. Status Desk mostra os contadores reais do coletor. Os contêineres compartilham o kernel da instância de treinamento. Todos os dados e solicitações são inofensivos. O laboratório trata da recorrência por cron, não de uma investigação completa de um servidor de produção.
Observar o programa que volta
Nesta etapa, você encerrará um programa de envio ativo e verá por que terminar uma instância não remove a causa.
Abra Status Desk. refreshes conta solicitações bem-sucedidas de atualização do cache e deve crescer a cada minuto. uploads conta solicitações indesejadas de treinamento, normalmente uma a cada cinco segundos. O histórico permanece após a correção. Recarregue a página para obter valores atuais.
Mude para Status Server. Um processo é um programa em execução. O PID identifica aquela instância; o caminho e os argumentos descrevem sua função. ps lista processos. -e seleciona todos, e -o escolhe as colunas: PID, PID pai (PPID) e comando completo com argumentos.
ps -eo pid,ppid,args
Localize /usr/bin/python3 /opt/status/uploader.py upload. Python é o interpretador, /opt/status/uploader.py é o arquivo do programa e upload seleciona a operação de treinamento. O processo flock próximo mantém um bloqueio para cron não criar cópias simultâneas. Não altere o programa de atualização do cache.
Um sinal é uma solicitação a um processo. TERM pede um encerramento normal. O pkill abaixo seleciona a linha completa com -f; ^ e $ no padrão entre aspas delimitam o início e o fim. Assim, ele atinge esse trabalhador Python, não o pai nem seu shell. Execute uma vez:
pkill -TERM -f '^/usr/bin/python3 /opt/status/uploader.py upload$'
Nenhuma saída é normal. Se não houver correspondência, liste novamente em vez de ampliar o padrão para todos os processos Python. Aguarde um segundo para o encerramento e volte a listar:
sleep 1
ps -eo pid,ppid,args
O programa Python deve desaparecer. O checkpoint verifica que a instância original terminou, sem afirmar que o servidor está limpo.
sleep espera o número indicado de segundos. Aguarde 80 segundos para atravessar pelo menos uma mudança real de minuto e liste novamente:
sleep 80
ps -eo pid,ppid,args
O mesmo caminho e argumento upload devem voltar com outro PID. Agora a cadeia de pais inclui CRON, o iniciador de tarefas do agendador. Um PID novo significa outra execução, não outra tarefa subjacente. Se a carga atrasar o disparo, espere mais 20 segundos e liste novamente. Recarregue Status Desk: os envios retornam e as atualizações legítimas continuam. Precisamos descobrir quem inicia o programa.
Encontrar e desativar o acionador recorrente
Nesta etapa, você relacionará o processo recorrente a um agendamento específico e desativará essa entrada sem apagar tarefas legítimas.
Cron é um daemon: um serviço em segundo plano que inicia comandos agendados. Um crontab de usuário contém as tarefas de uma conta. Este terminal é root dentro do contêiner de treinamento. Portanto, crontab -l lista o agendamento dessa conta alvo, sem afetar a conta da plataforma.
crontab -l
Você deve ver:
* * * * * /usr/bin/flock -n /run/uploader.lock /usr/bin/python3 /opt/status/uploader.py upload
Os cinco primeiros campos são minuto, hora, dia do mês, mês e dia da semana. * significa qualquer valor; * * * * * executa a cada minuto. O restante é o comando. flock -n obtém um bloqueio sem esperar: se outro programa de envio já o mantém, a chamada duplicada termina. O alvo corresponde ao processo encerrado.
Agendamentos de sistema também ficam em /etc/cron.d/. ls lista arquivos e cat mostra o conteúdo de arquivos curtos. O * depois do diretório é expandido para seus arquivos.
ls /etc/cron.d
cat /etc/cron.d/*
O arquivo status-cache contém:
* * * * * root /usr/bin/python3 /opt/status/cache-refresh.py refresh
Ao contrário do crontab de usuário, o arquivo cron de sistema inclui a conta, aqui root, entre os cinco campos de tempo e o comando. Esse comando permitido atualiza Status Desk. Horários semelhantes não tornam uma tarefa não autorizada. Outras entradas de manutenção fornecidas por pacotes podem permanecer.
Para editar com segurança, primeiro copie o agendamento atual do usuário para um arquivo de trabalho. > grava a lista nesse arquivo, substituindo uma cópia anterior. Faça isso apenas uma vez antes da edição: repetir sobrescreveria seu rascunho.
crontab -l > /srv/status/root.cron
nano abre um editor de texto. Coloque # no início da linha do programa de envio. Cron ignora comentários que começam com #. Preserve o texto para recuperação e mantenha as outras entradas.
nano /srv/status/root.cron
Use as setas para ir ao início da linha, digite #, pressione Ctrl+O, Enter para salvar e Ctrl+X para sair. Instale o arquivo editado passando seu caminho a crontab:
crontab /srv/status/root.cron
crontab -l
A linha do programa deve começar com #. Cron recarrega alterações automaticamente; não é necessário reiniciar. Comentar apenas a cópia de trabalho não basta: você precisa instalá-la. Se editou a linha errada, abra o rascunho, restaure-a e instale novamente. O programa atual pode continuar ativo: remover um agendamento não termina um processo já iniciado.
Remover a cópia ativa e verificar a recuperação
Nesta etapa, você concluirá a limpeza e comparará a atividade indesejada com a função de negócio durante um intervalo completo.
Encerre o programa Python atual com o mesmo padrão exato:
pkill -TERM -f '^/usr/bin/python3 /opt/status/uploader.py upload$'
Se já estiver ausente, a saída sem correspondência é esperada e você pode continuar. Aguarde um segundo para o encerramento:
sleep 1
curl faz uma solicitação de rede. -sS oculta o progresso, mas mostra erros. Essa URL identifica o contêiner do coletor interno, acessível a partir de Status Server. /state retorna os contadores atuais e os timestamps Unix das últimas solicitações.
curl -sS http://collector:8080/state
Observe uploads, refreshes e last_refresh. Deixe então o cron real funcionar:
sleep 80
curl -sS http://collector:8080/state
uploads deve permanecer igual, enquanto refreshes e last_refresh aumentam. Recarregue Status Desk para ver os mesmos fatos. Envios antigos ficam como evidência; apagar o contador oculta o histórico, não corrige a recorrência.
Liste os processos mais uma vez:
ps -eo pid,ppid,args
cron -f permanece presente; -f mantém o daemon do contêiner em primeiro plano. O programa de envio deve continuar ausente. O checkpoint observa mais 80 segundos de forma independente; reserve cerca de 90 segundos para a avaliação. Ele apenas lê a configuração e o estado real.
Se os envios crescerem, reveja os dois locais cron e a instalação do crontab comentado. Se as atualizações pararem, restaure a entrada permitida status-cache. Nunca pare cron nem remova todos os agendamentos para esconder o sintoma: o serviço de status depende deles. Essa correção remove o mecanismo cron demonstrado; não prova que um servidor real esteja livre de todos os mecanismos possíveis de persistência.
Resumo
Você distinguiu uma instância de processo do seu iniciador, seguiu a cadeia de pais até cron, examinou agendamentos de usuário e sistema, desativou um acionador indesejado e confirmou que as atualizações de negócio continuavam durante um minuto sem novos envios.



