Listando Processos em Execução com LINQ

Esse artigo é uma dica rápida para mostrar como podemos usar a biblioteca LINQ do .Net Framework para manipular processos em execução na máquina. Na prática, um usuário pode acessar o gerenciador de tarefas em sistemas operacionais Windows para visualizar os processos (programas) em execução no momento. Um desenvolvedor pode se deparar com uma situação na qual ele tem de saber quais são os processos rodando na máquina. Programaticamente, é possível usar o LINQ para filtrar e apresentar tais processos.

A motivação surgiu lendo uma discussão em grupo de Java no facebook. Um rapaz postou uma solução defeituosa (em Java) para listar os processos em execução. O .Net antecipa-se ao Java nesse sentido, pois a plataforma da Microsoft possui uma API que permite ao desenvolvedor, com poucas linhas de código, implementar uma solução customizada para um problema sem ter de escrever manualmente todos os passos para que a operação seja realizada. Esse código está escrito no “background” do framework, pronto para ser consumido.

A API a qual me refiro é a System.Diagnostics que você deve referenciar no começo da classe:


using System.Diagnostics;

Veja como fica simples a solução. Em uma aplicação Console, para simplificar, cole e teste o código abaixo. O método GetProcesses() da classe Process retorna um array de processos em execução na sua máquina. A partir desse array, eu utilizo o método de extensão Select para filtrar os processos pelo nome.


var ps = Process.GetProcesses();
var processos = ps.Select(proc => proc.ProcessName);

//ou ainda
var processos = Process.GetProcesses().Select(proc => proc.ProcessName);

O mesmo exemplo sem utilizar métodos de extensão fica assim:


var queryProcessos = from proc in ps
                     select new { proc.ProcessName };

foreach (var processo in queryProcessos)
{
    Console.WriteLine("Processo: " + processo.ProcessName);
}

Console.ReadLine();

O “select new…” faz a projeção, selecionando um subconjunto específico da fonte de dados. Assim eu consigo no foreach acessar a propriedade ProcessName de um processo.

Um leitor levantou uma discussão acerca de como o Java lida com a listagem de processos por esta plataforma. Para abrir um parênteses, em suma:

  1. O Java ainda não tem uma API dedicada como a System.Diagnostics para listagem de processos em execução. O desenvolvedor tem de criar uma solução customizada (um método), com risco à falhas;
  2. Uma solução possível é chamar DLLs externas em C++. Isso consome bastante memória, não é recomendável.
  3. O Java SDK (a partir da versão 6) fornece uma API (JPS) para monitoramento e diagnóstico de problemas em ambientes de produção, no entanto, ela é restrita apenas para aplicativos Java em execução.

Em breve mais artigos para essa série de LINQ que estou fazendo.

Referência: Manipulação de Processos (MSDN)

Até a próxima,

Thiago

Anúncios

5 Respostas para “Listando Processos em Execução com LINQ

  1. Legal!
    A critério de compartilhamento de conhecimento :).
    Com Java rodando no sistema operacional Windows é possível conseguir o mesmo (quanto a listagem) através da classe Runtime:

    runTime = Runtime.getRuntime();
    runTime.exec(“tasklist > ProcessListFile.txt”)
    

    tasklist é um programa padrão disponibilizado pela Microsoft. Runtime executa comandos do SO. É possível adquirir a lista de processos usando algum Stream ou com o código acima é possível criar um arquivo no SO com o resultado.

    Para Linux, por exemplo, o seguinte código é suficiente para capturar a lista:

    runTime = Runtime.getRuntime();
    runTime.exec("ps -ef")
    

    [Platform Independence] Nestes exemplos, Java delega para o sistema operacional a capacidade de listar seus processos em execução e requisita o resultado.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s