Listando Todos os Programas Sendo Executados

Olá,

Tenho uma dúvida que seria muito simples de resolver com código nativo mas é exatamente disseo que estou fugindo.

Existe algum componente ou coisa do tipo que me liste todos os processos sendo executados no sistema? Basicamente eu preciso de uma lista com todos os programas que o usuário atual está executando neste instante, em Java SE. Pode ser um objeto cheio de frescuras ou apenas uma String com o título da Janela, funcionando em Windwos, mac e Linux.

Qualquer versão de Java tá valendo, qalquer biblitoeca de terceiros também (desde que seja 100% Java).

Opa!

Passei parte do feriado procurando isso também e também não achei. Só achei que sem código nativo não tem como. Pelas regras da JVM, realmente não teria acesso a nada que não fosse do domínio dela, então como conseguiria pegar os processos externos?

Até!

Acho que você vai ter de escrever aquele tipo de programas assim, com um monte de “Runtime.exec”:

if (Windows) {
    gravar um script em VBscript (ps.vbs) que lista os processos
    pegar a saída de "cscript //NoLogo ps.vbs"
} else if (MacOSX) {
    pegar a saída de "ps a"
} else if (Solaris) {
    pegar a saída de "ps -ef"
} else if (Linux) {
    pegar a saída de "ps a"
} else if (AIX) {
    pegar a saída de "ps -- não sei os parâmetros --"
} else ... {
    ...
}

É óbvio que alguém já deve ter feito isso antes, é questão de procurar.

Então, mas o que eu estava procurando e que eu acho que pcalcado também era uma classe que não fosse executar "ps"s da vida e sim algo já em java.

E para pegar os processos rodando em linux, eu acho melhor listar a pasta “/proc”. Ali tem tudo o que você pode precisar dos processos sem precisar saber dos parâmetros.

Até!

O /proc está disponível em Linux, e acho que também nas versões mais novas do Solaris. (Eles adaptaram bastante coisa do Linux, como a interface Gnome, e se não me engano há um módulo de compatibilidade com o Linux que, instalado, permite rodar vários programas Linux sob o Solaris - embora seja preferível recompilar o programa, se possível.)

No MacOS X, ps usa o recurso "setuid", portanto ele pode acessar coisas que um usuário normal não pode.

$ ls -la /bin/ps
-rwsr-xr-x  1 root  wheel  36516 29 Jan 08:13 /bin/ps

Um usuário normal pode listar várias coisas do /proc, o que é bastante útil. Dessa forma, o ps não precisa ter seu bit "setuid" ligado.
Infelizmente, o /proc não está disponível no MacOS X.

United Linux 1.0:

thingol@beleriand:~&gt ls -la /bin/ps
-r-xr-xr-x    1 root     root        85180 2002-10-16 11:58 /bin/ps

Nash, um parser de linha de comando dá pro gasto, queria apenas saber se existe alguma forma mais padrão para fazer isso.

Já que estamos aqui, este código é muito bom para passar a idéia mas antes que alguém leia este tópico e faça algo parecido: Usem polimorfismo, pelo amor de Zahl. ‘else if’ e ‘switch/case’ são bad smells de programação altamente procedural.

Tá bom, algo como

PS ps = PS.getInstance ();
...
class WindowsPS extends PS {
}
class MacOSX extends PS {
}
...