O CRaSH (Common ReusAble SHell - Shell Comum Reutilizável) é um utilitário que fornece uma interface em linha de comando para interagir com um processo Java em execução. Ele se conecta a uma JVM e pode inspecionar suas estruturas internas. Não é apenas um shell escrito em Java (como o BeanShell), oferecendo gerenciamento e monitoramento remoto de aplicações rodando em uma JVM, de forma semelhante ao Java Management Extensions (JMX). O CRaSH lançou a versão 1.0 no início deste ano e recentemente introduziu uma demo online mostrando as suas funcionalidades básicas.
O suporte ao JMX deve ser explicitamente criado numa aplicação Java. A instalação do Java por padrão, inclui ferramentas gráficas como JConsole e, mais recentemente o VisualVM, que podem se conectar a uma aplicação Java em execução, e recuperar estatísticas como uso de memória, informações sobre threads, propriedades da JVM etc.
O suporte ao JMX também permite que desenvolvedores e administradores de sistemas alterem configurações da aplicação em tempo real, enquanto a aplicação executa. (Essa funcionalidade só está disponível para as propriedades já expostas pelos desenvolvedores na forma de interfaces MBean.) Desde o Java 6, no entanto, é possível utilizar a Atach API para desenvolver aplicações de monitoração que programaticamente se conectam a uma JVM. Um exemplo é o jtop, uma aplicação de linha de comando que monitora a utilização da CPU pelas threads. Esta API é específica à máquina virtual Hotspot.
O CRaSH leva esse conceito ainda mais longe. Tira proveito da Atach API e fornece um shell de linha de comando, com comandos internos, histórico e autocomplementação de comandos. O shell se conecta a uma JVM em execução e pode ser utilizado para carregar e executar scripts Groovy que executam nessa JVM. Fornece também acesso interativo aos componentes internos da JVM, permitindo acompanhamento mais detalhado.
O CRaSH já vem com suporte para:
- Inspeção/alteração de propriedades da JVM;
- Execução do coletor de lixo;
- Acesso a recursos do JDBC utilizando SQL;
- Acesso via telnet ou SSH (o JMX usa Java RMI, que pode ser problemático com firewalls);
- Recuperação de estatísticas de uso de memória;
- Gerenciamento de threads da JVM;
- Carregamento de scripts externos escritos em Groovy;
- Acesso a repositórios JCR (por exemplo, Jackrabbit);
- Registro dos comandos em log.
As principais funcionalidades do CRaSH podem ser vistas em ação em um vídeo que demonstra a execução de scripts Groovy em uma JVM em execução. Outro vídeo mostra o CRaSH se conectando a um servidor de aplicações e executando comandos SQL em uma fonte de dados, através de comandos JDBC integrados. O CRaSH funciona basicamente como uma camada entre uma JVM em execução e os scripts personalizados em Groovy, que são criados pelo desenvolvedor na forma de "receitas" de monitoramento .
Algumas possíveis utilizações são:
- Monitoração de uma aplicação numa JVM em execução (para administradores de sistema, de forma similar ao JMX);
- Ajustes finos em aplicações numa JVM em execução (para desenvolvedores);
- Depuração/log de aplicações em JVMs em execução (possivelmente após um evento específico);
- Adição de uma interface em linha de comando para uma aplicação já existente; rodando em uma JVM (voltada para usuários avançados);
- Maneira fácil de carregar "plugins" em tempo de execução;
- Substituição de algumas partes de uma aplicação rodando numa JVM, ou interceptando as interfaces de I/O;
- Orquestração de diferentes recursos e serviços a partir de um ponto central;
- Funcionamento como ponte para execução conjunta de códigos Java e Groovy.
Para mais informações, consulte a documentação do projeto, o Javadoc e o grupo de discussões. O código está hospedado no GitHub.