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.