executar um arquivo sh pelo java

1,083 views
Skip to first unread message

Elon G. Vieira

unread,
Jun 24, 2009, 7:01:26 PM6/24/09
to Grupo de Software Livre do Sul Fluminense
Ola, estou com um problema, e peço a ajuda a ajuda de vcs.
a situação é a seguinte: Eu tenho um arquivo um arquivo sh que tem
comandos do imagemagick para converter jpg em pdf, quando mando
executar no linux por terminal ou clicando ele executa normalmente,
mas nao consigo executar esse arquivo pelo java, ja procurei e to
ficando meio sem saida, uma outra alternativa seria usar o frame work
IText que manipula pdf mas so concegui adicionar uma figura no pdf, e
qro converter a figura em pdf para dar zoom na imagem e tudo mais, que
é assim q o pdf fica quando executo o arquivo sh na mao. se alguem
puder me ajudar ficarei muito grato.

Obrigado
abraço pra todos

Bruno Nardini

unread,
Jun 24, 2009, 8:41:10 PM6/24/09
to flsulfl...@googlegroups.com

Você quer executar o script sh pelo java, ou quer que o java faça o mesmo que o script faz?

2009/6/24 Elon G. Vieira <elong...@yahoo.com.br>



--
Bruno Nardini
Analista de Negócios da RB desenvolvimento
http://www.rbdesenvolvimento.com.br
--
MegaTrøøm
Linux User #484175 (http://counter.li.org)
http://sites.google.com/site/megatroom3

Renato Martins

unread,
Jun 24, 2009, 9:26:37 PM6/24/09
to flsulfl...@googlegroups.com
vê se ajuda!
 
2009/6/24 Bruno Nardini <megat...@gmail.com>



--
------------------------------------------------------»
яB Desenvolvimento

Duodecimo Fernandes

unread,
Jun 25, 2009, 10:04:53 AM6/25/09
to Grupo de Software Livre do Sul Fluminense
Talvez o código abaixo ajude um pouco.
Observe que a parte do BufferedReader só é necessária para podermos
obter a saída do prorgrama executado, caso precisemos dela.

// arquivo: ExecutaComando.java
import java.io.*;

public class ExecutaComando
{
public static void main(String[] args)
{
try
{
String linha;
String comando = "ls";
// no windows, utilize "dir" acima, por exemplo ...
Process processo = Runtime.getRuntime().exec(comando);
BufferedReader input = new BufferedReader
(new InputStreamReader(processo.getInputStream()));
while((linha = input.readLine()) != null)
{
System.out.println(linha);
}
input.close();
System.out.println("Fim!");
}
catch (Exception ex)
{
System.out.println("Erro na execucao do comando:\n" +
ex.getMessage());

Elon G. Vieira

unread,
Jun 25, 2009, 11:29:50 AM6/25/09
to Grupo de Software Livre do Sul Fluminense
Muito obrigado a todos pela ajuda,
mas infelizmente ainda nao deu certo,

respondendo
Bruno Nardini: no momento eu estou tentando executar pelo java um
script sh ja pronto, mas a idea é gerar os scrips dinamicamente, mas
isso nao é dificil, o problema é q o script sh nao ta rodandando,

Renato Martins: cara obrigadao, mas o exemplo la eu ja tinha tentado
um bem parecido
mas vlw, brigado msm,

Doudécimo: vlw msm pelo exemplo, ele era praticamente o q eu qria msm,
por ali funcionam os comandos do console, da pra rodar o ls, o gedit +
o nome do arquivo, mas o arquivo sh ele num roda, :-(, eu substitui o
ls do seu codigo por "sh /media/disk/converter.sh", ele nao da erro,
nem gera exceção mas tb nao executa o sh, quando eu to dois cliques no
arquivo ele converte normalmente mas quando executa pelo java nao
acotece nada, nem mensagem, nem nada ai nao tenho a minima ideia do
pq.

obrigado a todos, se vcs souberem mais de algo, me falem q eu vou
tentando aki, rs

abraçoo

Duodecimo Fernandes

unread,
Jun 26, 2009, 10:45:35 AM6/26/09
to Grupo de Software Livre do Sul Fluminense
Caro Elon,

Teste da seguinte forma:

Crie o arquivo myLs.sh:
#!/bin/sh
ls *.java

coloque permissões de execução:
chmod a+x myLs.sh

substitua no código que enviei a linha:
String comando = "ls";
pela linha:
String comando = "sh myLs.sh";

compile, voce vai ver que ele executa um comando ls listando todos os
arquivos com extensão .java na pasta atual.

Elon G. Vieira

unread,
Jun 26, 2009, 11:41:59 AM6/26/09
to Grupo de Software Livre do Sul Fluminense
Eu fiz exatamente o q vc falo, eu criei o arquivo myLs.sh
dei a permição de execução, ai quando executo pelo console ele executa
normalmente
exibe todos os arquivos de extenção java.
mas ai quando mando executar pelo java ele nao exibe nada, assim como
o meu outro converter.sh

public static void main(String[] args) {
try {
String linha;
String comando = "sh /media/disk/myLs.sh";
// no windows, utilize "dir" acima, por exemplo ...
Process processo = Runtime.getRuntime().exec(comando);
BufferedReader input = new BufferedReader(new
InputStreamReader(processo.getInputStream()));
while ((linha = input.readLine()) != null) {
System.out.println(linha);
}
input.close();
System.out.println("Fim!");
} catch (Exception ex) {
System.out.println("Erro na execucao do comando:\n" +
ex.getMessage());
}
}

eu ja dei permição pro arquivo sh, ja dei pro projeto java
mas nada faz executar os arquivos sh

kra obrigadao por tentar me ajudar
abração
te mais

Duodecimo Fernandes

unread,
Jun 26, 2009, 1:22:55 PM6/26/09
to Grupo de Software Livre do Sul Fluminense
É uma pena se você vai desistir.
Acredito que agora o problema não é no Java, muito provavelmente são
nas permissões de execução.
Normalmente a pasta /mnt não oferece, em sistemas linux, permissão
para contas de usuário executarem programas.
Um teste básico seria feito colocando myLs.sh na mesma pasta em que
está o programa Java, como eu propus originalmente, e verificar se
funciona (acredito que vai funcionar). Chegando até aí, você passa a
lidar com o próximo problema, específico do linux e seu file system (e
que não vai ser difícil de resolver).

Elon G. Vieira

unread,
Jun 26, 2009, 8:30:06 PM6/26/09
to Grupo de Software Livre do Sul Fluminense
Kra obrigadao pela ajuda,
mas eu nao desisti nao
vou continuar tentando aqui
mas nao estou dispensando a sua ajuda nao
voce me ajudo bastante
mas vou continuar tentando fazer

eu ja tinha tentado coloca ele na pasta dentro do programa
mas tambem nao funciono, eu tb acho que o problema
esta relacionado a permições do linux, mas ja dei todas as permições
e ainda nao rolo nada nao.

vou continuar tentando aqui
se vc ou alguem conseguir algo
pod me falar
=D

obrigadaoo
te mais

Bruno Nardini

unread,
Jun 27, 2009, 8:32:07 AM6/27/09
to flsulfl...@googlegroups.com
Olha, um cara que eu ajudei teve o mesmo problema com execução de arquivo através do PHP.

O problema era que o APACHE não tinha permissão para executar o arquivo.

No caso do Java, talvez seja o JVM que não tenha permissão para executar o arquivo. Se vc estiver usando JSP, pode ser o Tomcat.

O que eu faria no seu caso, é primeiro fazer o java criar um arquivo, depois eu iria no linux e veria qual o usuário e grupo que esse arquivo tem (ou está). Se ele criou um arquivo como root, então o problema nao é permissão, mas se não, tenta fazer o java ganhar os poderes da super vaca, e ter acesso de root.

Outro bom de se fazer, é fazer o java executar um script simples, para ter certeza que não é o que o script faz que não é o problema. Como um print da vida.


2009/6/26 Elon G. Vieira <elong...@yahoo.com.br>

Renato Martins

unread,
Jun 27, 2009, 9:25:48 AM6/27/09
to flsulfl...@googlegroups.com
Vê se esse ajuda!

http://www.daniweb.com/forums/thread82596.html#



2009/6/27 Bruno Nardini <megat...@gmail.com>



--
------------------------------------------------------»
яB Desenvolvimento

Flavio Genelhu Oliveira

unread,
Jun 28, 2009, 1:00:49 PM6/28/09
to flsulfl...@googlegroups.com
Não seria pq vc usou a "/" barra na sua string? Voce não precisa de usar
algo como:

"sh \/media\/disk\/myLs.sh" ? Eu não entendo nada de Java, mas em C vc precisa destas coisas com caracteres
especiais.

PS: Estou meio que voltando a ativa no grupo. Estou religando minha net em breve (tive que desligar por um tempo)
e ja tenho um acesso decente pelo menos temporário. Embora sempre acompanhei o grupo lendo os e-mails em LAN Houses.

Abraços a todos


Elon G. Vieira escreveu:

Duodecimo Fernandes

unread,
Jun 28, 2009, 3:34:11 PM6/28/09
to Grupo de Software Livre do Sul Fluminense
Ok,

Vamos checar alguns detalhes importantes:
O primeiro é: Qual a distribuição e versão linux que vc está
utilizando pra testar?

Kayo

unread,
Jun 28, 2009, 4:46:02 PM6/28/09
to flsulfl...@googlegroups.com
Ele está usando a versão Ubuntu 9.04

Duodecimo Fernandes escreveu:
--
..::Noturno::..

Kayo Delgado Medeiros de ALmeida

kayod...@gmail.com
kayod...@yahoo.com.br
kayod...@hotmail.co.uk

Bruno Nardini

unread,
Jun 28, 2009, 10:42:46 PM6/28/09
to flsulfl...@googlegroups.com

e se ele colocar "sudo sh ...", nao funciona?

2009/6/28 Kayo <kayod...@gmail.com>

Duodecimo Fernandes

unread,
Jun 29, 2009, 11:36:33 AM6/29/09
to Grupo de Software Livre do Sul Fluminense
O Ubuntu eventualmente pode causar alguns problemas ao rodar java por
default:
Ele parece que instala o OpenJava, ao invés do Java da SUN.
Nada de fim de mundo aí, acontece que algumas classes implementadas no
Java SUN não são imediatamente disponibilizadas em outros sabores. Por
outro lado me arrisco a dizer que grande parte dos trabalhos
profissionais desenvolvidos em Java utilizam o JRE e/ou JDK da SUN.
Não vou iniciar uma discussão aquí sobre Java SUN, outras
implementações java open source, etc.
Basta saber que a Sun abriu o Java. Até que isso seja refletido
integralmente no Java SUN, é preciso esperar pelas próximas versões.
Eu testei o código que enviei no Java da SUN, JSE (SD) 1.13_04,
rodando em Slackware 12.0.
Eu acredito que se o Elon utilizar o Java SUN deve rodar.
Se não me engano, ele está disponibilizado em algum daqueles
repositórios extras do Ubuntu, testamos a algumas semanas em um
notebook, com o Claudio Martinelli, e funcionou direitinho.
Apenas recomendo atenção para o fato de que mesmo instalando o pacote
do Java SUN, o OpenJava fica com a preferência no Path e Classpath.
(para verificar é só lançar java --version).
Portanto, é bom verificar em que pasta está instalado, e rodar com um
comando específico, i.e.:
/opt/java1.13_14/bin/javac ExecutaComando.java
/opt/java1.13_14/bin/java ExecutaComando
Se for necessário, pode-se colocar a opção -cp,
/opt/java1.13_14/bin/javac -cp .:/opt/java1.13_14/src.zip
ExecutaComando.java (não esqueça o ponto que precede :)
/opt/java1.13_14/bin/java -cp .:/opt/java1.13_14/src.zip
ExecutaComando
Assim, deve funcionar ...
> kayodelg...@gmail.com
> kayodelg...@yahoo.com.br
> kayodelg...@hotmail.co.uk

Kayo

unread,
Jun 29, 2009, 4:42:41 PM6/29/09
to flsulfl...@googlegroups.com
Ele utiliza o java sun sim...
Não é o open nao!

Duodecimo Fernandes escreveu:
kayod...@gmail.com
kayod...@yahoo.com.br
kayod...@hotmail.co.uk

Elon G. Vieira

unread,
Jun 29, 2009, 11:18:01 PM6/29/09
to Grupo de Software Livre do Sul Fluminense
Desculpem a minha ausência

como o kayo disse eu uso o java da sun sim, pq ja tinha tido problema
com
o open java no linux.
eu andei pesquisando sobre a jvm nao permitir a execução de alguns
arquivos
mas nao achei nada sobre o assunto, que esta dando uma boa discução
e uma boa dor de cabeça em achar algo que resolva o problema
=D
rs

Elon G. Vieira

unread,
Aug 10, 2009, 5:22:37 PM8/10/09
to Grupo de Software Livre do Sul Fluminense
Ola amigos, este tópico aqui foi resolvido, obrigado a vcs, e ao Kayo
com seus conhecimentos de Linux, =D

vou colocar para vcs o codigo que usei para resolver meu problema.
antes eu tentava executar comandos que estavam dentro do arquivo .sh
como nao concegui fazer ele funcionar foram incluídos os codigos do
arquivo .sh
no codigo fonte java como vou mostrar para vcs.

for (int cont = 0; cont < arquivos.length; cont++) {
String comando = "convert -quality 71 -resize 2000x2500 " +
arquivoOrigem + " " +arquivoDestino );
Runtime.getRuntime().exec(comando).waitFor();//espera até
que a tarefa esteja complera
Runtime.getRuntime().exec(comando).destroy();
}

assim o codigo acima converte e reduz o tamanho do arquido em uma so
tacada.
se alguem for fazer algo parecido é muito importante nao esquecer de
dar um destroy().

Obrigado
Reply all
Reply to author
Forward
0 new messages