Executar comando Unix na aplicação web

9 respostas
danieldestro

Caros,

Tenho uma aplicação web que monitora meu ambiente de produção (Solaris + Java 5 + JBoss 4.0.3-SP1).

Um dos JSPs executa uma linha de comando do sistema operacional e imprime o resultado na tela. Imprimia!

Isso funcionava normalmente num Solaris + Java 4 + JBoss 3.2.3. Agora no ambiente novo não rola.

Ele dá um NullPointerException numa das linhas:

Process process = Runtime.getRuntime().exec( "ulimit -n" ); is = process.getInputStream();

Isso se deve ao fato do comando ser inválido, creio eu.

Eu executo o mesmo comando na linha de comando e funciona. Tentei rodar o JBoss com o usuário “root” e também dá pau.

Se eu troco pelo comando “ls”, ele funciona normalmente.

Alguem tem alguma idéia?

Valeu!

9 Respostas

louds

ulimit não é um binario dependendo do SO e sim um comando imbutido do shell

danieldestro

E isso significa que… ???

Z

Acho que você teria que iniciar o processo chamando o binário do shell, passando o nome do comando como parametro.

Talvez algo do tipo:

Runtime.getRuntime().exec( "/bin/bash ulimit -n" );
danieldestro

E quanto tem que executar algo assim:

for iq in `netstat -na | grep ESTA | sort -k5 | cut -b22-38 | sort -u`; do echo $iq; a=`netstat -na | grep $iq | wc -l`; echo "IP:$iq Conexoes: " $a; done | sort -k2r | grep -v 172.23. | head -n20

???

T

De modo geral, para saber se um comando é do shell, ou se ele é um executável, use o comando type. Exemplo:

linux:~ # type ulimit
ulimit is a shell builtin
linux:~ # type mv
mv is /bin/mv
linux:~ # type ls
ls is aliased to `ls $LS_OPTIONS'

Esse comando também funciona no Solaris e em outras versões do Unix. No Solaris 10 - Intel:

# type ulimit
ulimit is a shell builtin
# type mv
mv is /usr/bin/mv
# type ls
ls is /usr/bin/ls
O

Verifique qual era a shell default do usuário que rodava o JBoss anteriormente.
Para ficar independente desta variavel, rode como o pessoal sugeriu, passando qual a shell que vai rodar o programa/script, pois a sintaxe dos comandos internos varia de shell.

Z

danieldestro:
E quanto tem que executar algo assim:

for iq in `netstat -na | grep ESTA | sort -k5 | cut -b22-38 | sort -u`; do echo $iq; a=`netstat -na | grep $iq | wc -l`; echo "IP:$iq Conexoes: " $a; done | sort -k2r | grep -v 172.23. | head -n20

???


Coloca isso em um arquivo de script e executa esse arquivo:
/bin/bash nome_do_arquivo_que_criou.sh

danieldestro

Valeu galera… ajudaram muito mesmo.

O admin falou há pouco que o ambiente mudou de solaris para linux. Eu nçao sabia. Por isso parou de funfar.

As idéias do ZehOliveira e JOMI funcionaram perfeitamente.

J

Nao sei se é o seu caso, mas tive um problema semelhante na empresa e descobri que vc tem que passar os comandos separados como por exemplo:

String cmds[] = new String[3];

cmds[0] = “/bin/ksh”;

cmds [1] = “-c”;

cmds [2] = cmd;

Process process = Runtime.getRuntime().exec(cmds);

onde cmd é o comando. Dava erro quando tentava executar isso:
cp " + arquivoCompactado + ".Z " + dirEntrada, por exemplo

Colocando no array, funcionou…

Criado 27 de outubro de 2006
Ultima resposta 27 de out. de 2006
Respostas 9
Participantes 6