O que causa o erro ‘O arquivo SX2NT0 não existe’

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.

Dan (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta