No artigo de hoje vamos demonstrar o que causa o erro relacionado ao arquivo SX2NT0 na Protheus Data.
Recentemente um cliente nos convocou relatando que vários arquivos estavam sendo criados na Protheus Data, na pasta system, com a nomenclatura sc*.log, com o conteúdo:
O arquivo SX2NT0 não existe.
Final
Após alguns testes e rastreios, isso é devido ao fato de algum serviço automático (como job, webservice, etc) iniciar antes dos outros quando a nova tela de login esta habilitada. Então esses logs ficam sendo gerados sem parar.
O que eu indiquei então para o cliente é modificar a forma de subir os serviços, pois na ocasião dele, todos subiam ao mesmo tempo. Portanto ficou dessa forma:
- Subir o serviço do License Server e aguardar uns 30 segundos
- Subir o serviço do DbAccess e aguardar uns 15 segundos
- Subir os serviços que os usuários usam (Broker, antigo Master, slaves, etc)
- Subir os serviços automáticos (schedule e webservices)
Agora caso, você queira também, criamos uma função em AdvPL para fazer a limpeza da system, apagando todos os arquivos sc*.log.
Basta executar u_zLimpaLog no programa inicial, após compilar a função abaixo.
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zLimpaLog Função que apaga os logs temporários da system @type Function @author Atilio @since 08/12/2022 @obs Foi criado essa tratativa devido a inúmeros arquivos que são gerados com o conteúdo similar ao abaixo: O arquivo SX2NT0 não existe. Final /*/ User Function zLimpaLog() Local aArea Local lContinua := .F. //Se a SX2 não estiver aberta, prepara o ambiente (para poder chamar direto no programa inicial ou via job) If Select("SX2") == 0 RpcSetEnv("01", "0101", "", "", "") lContinua := .T. //Senão, mostra a pergunta se deseja executar Else lContinua := FWAlertYesNo("Deseja executar a limpeza da Protheus Data dos arquivos sc*.log?", "Continua?") EndIf aArea := FWGetArea() //Aciona a exclusão dos logs If lContinua Processa({|| fApagaLogs() }, "Deletando os logs...") EndIf FWRestArea(aArea) Return Static Function fApagaLogs() Local aArqs := {} Local nTotal := 1 Local nCurrent := 0 //Foi colocado em um Laço, pois por padrão tanto Directory() como aDir() tem uma //limitação de retornar no máximo 10.000 arquivos While nTotal > 0 //Busca os arquivos para apagar aArqs := Directory("\system\sc*.log") nTotal := Len(aArqs) //Define o tamanho da régua ProcRegua(nTotal) //Percorre os arquivos e exclui For nCurrent := 1 To nTotal IncProc("Excluindo arquivo " + cValToChar(nCurrent) + " de " + cValToChar(nTotal) + "...") //Se o arquivo existir, apaga If File(aArqs[nCurrent][1]) FErase(aArqs[nCurrent][1]) EndIf Next EndDo Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.