[RESOLVIDO]Como verificar processos em execução e mata-los em Java?

11 respostas
S

Pessoal,

É o seguinte, necessito criar uma rotina em Java onde verifique os processos e subprocessos que estão rodando em uma máquina windows e se esses processos demorarem mais que um determinando tempo (ex. : 30 minutos) eu possa mata-los.
Mas acredito que deveria rodar algum “robo” que ficasse vendo esses processos se estão em execução, po favor gostaria de um luz para desenvolver essa rotina.

Obrigado

11 Respostas

E

Você precisa de alguns programas, como o pskill e o pslist, que podem ser obtidos em

Uma vez feito isso, redirecione a saída do pslist para obter a lista de processos, e use o pskill para matá-los.

S

certo, mas teria uma outra alternativa sem usar programas externos ? pq estava vendo esses programas devem rodar com privilégio de administrador, e não sei se a minha aplicação terá esses privilégios no servidor onde ele fará essa pesquisa

Obrigado

E

Sim, mas você precisa desses privilégios de qualquer maneira, para poder listar processos ou matá-los.

S

correto, mas acho que vc não precisa ser administrador para poder dar um tasklist ou taskkill não é ?

Obrigado

E

Se os processos forem seus, você não precisa privilégios para usar pslist, tasklist, taskkill ou pskill. Se os processos não forem, taskkill e pskill requerem privilégios adequados.

S

me confundi pois estava fazendo alguns testes aqui mas o serviço não era meu mesmo, desculpa a confusão. rsrsrs

Obrigado

A

seleghini:
certo, mas teria uma outra alternativa sem usar programas externos ? pq estava vendo esses programas devem rodar com privilégio de administrador, e não sei se a minha aplicação terá esses privilégios no servidor onde ele fará essa pesquisa

Obrigado

Você pode criar uma biblioteca dinâmica (DLL) em C, e usar suas funções em Java. Caso for fazer isso, procure pela documentação da API do Windows. Você pode, por exemplo, dar uma olhada na função TerminateThread():

Também há a função EnumProcesses(), para listar os processos:

E

Eu em particular já usei tais métodos em programas C/C++. Não são muito triviais de usar, e como há um “callback” no caso de EnumProcesses, é necessário escrever mais código C/C++ que o desejável em um programa Java.

Sinceramente eu prefiro chamar um executável separado (basta redirecionar a saída para um arquivo, e ler esse arquivo :slight_smile: ) , a menos que eu veja que isso está consumindo CPU demais, o que normalmente não é o caso.

J

entanglement:
Eu em particular já usei tais métodos em programas C/C++. Não são muito triviais de usar, e como há um “callback” no caso de EnumProcesses, é necessário escrever mais código C/C++ que o desejável em um programa Java.

Sinceramente eu prefiro chamar um executável separado (basta redirecionar a saída para um arquivo, e ler esse arquivo :slight_smile: ) , a menos que eu veja que isso está consumindo CPU demais, o que normalmente não é o caso.

O problema é que a cada chamada do sistema(carregar os softwares externos) vai dar um pico na cpu. É uma alternativa simples mas não é a ideal. Sinceramente eu prefiro escrever isso em pascal ou c++.

S

valeu entanglement

eu resolvi utilizando os programas pslist e pskill mesmo criei um classe de schedule e a cada intervalo de tempo ele executa esses comandos para verificar e matar os processo.

obrigadão

J

Em c++ isso poderia ter sido feito simplesmente usando o framework qt. Criar esse tipo de solução em java é escrever mais e gastar mais tempo.

QProcess process; QStringList env = QProcess::systemEnvironment(); env << "TMPDIR=C:\\MyApp\\temp"; // Add an environment variable env.replaceInStrings(QRegExp("^PATH=(.*)", Qt::CaseInsensitive), "PATH=\\1;C:\\Bin"); process.setEnvironment(env); process.start("myapp");

documentação:

http://doc.qt.nokia.com/latest/qprocess.html

Criado 11 de julho de 2011
Ultima resposta 12 de jul. de 2011
Respostas 11
Participantes 4