Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

spdio

[Resolvido] Como um processo "se matar"?

Recommended Posts

Boa noite galera, td bem?

 

Preciso de ajuda para gerenciar a execução de um programa.

 

Imaginem um ambiente onde um programa é executado várias vezes com tempo definido (5 em 5 minutos por exemplo), ele faz uma leitura de varios arquivos e trata. Quando em um destes intervalos ele trava, ou demora mais que 5 minutos ele começa a "juntar" processos no tasklist.

 

A minha dúvida é se tem como eu tratar esse programa pra quando ele for executado, ele conferir se já existe um processo anterior "matar" esse mais antigo?

 

Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

em C não sei fazer... mas a técnica que a galera usa é a seguinte:

gravar o pid (process id) do processo em um arquivo texto, por exemplo, e antes de executar perguntar se o processo do pid gravado ainda está rodando, se tiver não executa novamente.

 

pesquise como salvar e capturar os processos na linguagem em questão que você terá uma solução simples assim.

 

 

 

Boa noite galera, td bem?

 

Preciso de ajuda para gerenciar a execução de um programa.

 

Imaginem um ambiente onde um programa é executado várias vezes com tempo definido (5 em 5 minutos por exemplo), ele faz uma leitura de varios arquivos e trata. Quando em um destes intervalos ele trava, ou demora mais que 5 minutos ele começa a "juntar" processos no tasklist.

 

A minha dúvida é se tem como eu tratar esse programa pra quando ele for executado, ele conferir se já existe um processo anterior "matar" esse mais antigo?

 

Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual sistema operacional você está usando?

 

A solução vai ser diferente para cada sistema operacional.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite pessoal, desculpem a demora!

 

Denilson Telaroli, entendi o que quis dizer e Renato Utsch uso o WindowsServer 2003, mas quem chama esse programa no Windows é um server Debian.

 

Abraço e obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

http://stackoverflow.com/questions/7956519/win32-api-how-to-kill-processes-by-name

 

A primeira resposta mostra como matar pelo nome do processo, sem precisar ser pelo pid dele. Agora, lembre-se que é case sensitive, edite o código para não ser ;)

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado novamente Renato, eu utilizei esse código e tive outro problemas, pode me ajudar?

 

Eu sou um programador Java e estou testando uns esquemas de leitura de logs, então, estou metendo a mão no C++. Estou curtindo, só que sabe né? Cada linguagem tem sua peculiaridade, manhas e "hacks", então é f*** saber tudo.

 

Desculpa te incomodar, mas puder me ajudar eu agradeço. Tive esse problema:

 

 

KillProcessByName("teste.exe");


void KillProcessByName(const char *filename)
{
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
   PROCESSENTRY32 pEntry;
   pEntry.dwSize = sizeof (pEntry);
   BOOL hRes = Process32First(hSnapShot, &pEntry);
   while (hRes)
   {
       if (strcmp(pEntry.szExeFile, filename) == 0)
       {
           HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
                                         (DWORD) pEntry.th32ProcessID);
           if (hProcess != NULL)
           {
               TerminateProcess(hProcess, 9);
               CloseHandle(hProcess);
           }
       }
       hRes = Process32Next(hSnapShot, &pEntry);
   }
   CloseHandle(hSnapShot);
}

 

 

------ Build started: Project: urafiles, Configuration: Release Win32 ------
Compiling...
.\readTxt.cpp(254) : error C2664: 'strcmp' : cannot convert parameter 1 from 'WCHAR [260]' to 'const char *'
       Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
urafiles - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 58 up-to-date, 0 skipped ==========

 

Eu procurei a respeito e li que existem duas formas de burlar isso, uma delas é mudar o character Set to "Use Multi-Byte Character Set" e a outra é adicionar um L a string algo como L"Hello World".

 

Tentei as duas, na primeira mudando o character set eu tive problema como restante do projeto, várias outras que ja estao prontas e funcinando ficam com problema de parse.

 

E ao adicionar o L na frente do nome do processo (qd chamo o metodo) tb não tenho resultados.

 

Sabe me dizer onde posso estar errado?

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que acontece é que o windows usa WCHAR no pEntry, você tem que converter de char para wchar.

 

Acho que isso deve resolver:

 

if (strcmp(pEntry.szExeFile, (WCHAR *) filename) == 0)

 

Se não, tente isso:

 

if (strcmp(pEntry.szExeFile, reinterpret_cast<WCHAR *>(filename)) == 0)

 

 

Se ainda não funcionar, tem que converter o filename para wchar, não lembro como é que converte, mas no google deve ter... pesquisa por "how to convert from char to wchar win32 api", deve dar algo...

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala cara, belza?

 

 

Obrigado novamente!

 

Eu acabei fuçando aqui e alterei o strcmp(pEntry.szExeFile, filename) para wcscmp(pEntry.szExeFile, filename) e o char pelo wchar_t. ompilou sem erros, vou testar e posto o progresso!

 

Obrigado

 

Abraço

 

 

void KillProcessByName(const wchar_t *filename)
{
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
   PROCESSENTRY32 pEntry;
   pEntry.dwSize = sizeof (pEntry);
   BOOL hRes = Process32First(hSnapShot, &pEntry);
   while (hRes)
   {
       if (wcscmp(pEntry.szExeFile, filename) == 0)
       {
           HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
                                         (DWORD) pEntry.th32ProcessID);
           if (hProcess != NULL)
           {
               TerminateProcess(hProcess, 9);
               CloseHandle(hProcess);
           }
       }
       hRes = Process32Next(hSnapShot, &pEntry);
   }
   CloseHandle(hSnapShot);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, era por isso que você deveria procurar, a função do strcmp() que usa wchar_t...

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.