Estou desenvolvendo um seviço web que aciona um programa Perl, trata os dados (enviados por upload) do usuário e devolve a saída para o user atraves de um download.
Entretanto, estou com dificuldades de acionar este programa em Perl.
Estou usando processos para executar, mas por algum motivo ele não executa.
exec requer o nome de um binário executável, não de um arquivo-texto executável.
Em vez de usar “//home//user//prog.pl” (que aliás não é um nome válido de um arquivo em Unix) talvez você tenha de usar:
/usr/bin/perl /home/user/prog.pl
ou
/bin/bash -c /usr/bin/perl /home/user/prog.pl
(Estou supondo que o perl esteja em /usr/bin/perl; veja na sua distribuição do Linux onde realmente ele está. Para saber isso, abra um terminal e digite o comando
type perl
Ele deve imprimir algo como
/usr/bin/perl
ou o lugar certo onde está o Perl.
C
caiocb
Então,
O meu perl está instalado no /usr/bin/ mesmo, e coloquei o perl na variavel de ambiente.
coloquei o comando completo com o “bash -c” mas não funcionou mesmo assim = \
[]'s
T
thingol
Vou explicar mais uma vez. exec usa uma API do Unix (acho que é execvpe ou coisa parecida) que requer o nome de um binário executável; então você precisa especificar que quer o perl. O interpretador de comandos (/bin/bash), por sua vez, sabe que se um arquivo é marcado como executável (chmod +x) e seu nome termina com .pl, deve chamar o /usr/bin/perl.
No seu caso, o comando seria
.......exec("/usr/bin/perl /home/user/prog.pl");
Em particular, não gosto muito de usar a versão do exec que recebe só um parâmetro. Prefiro pôr cada comando e parâmetro em uma posição de um array de strings, e chamar aquela versão do exec que recebe esse tal array.
C
caiocb
Olá thingol ,
Então, mesmo assim não foi. havia colocado este mesmo comando que vc me passou, mas de algum modo ele não executa mesmo.
Fiz um teste aqui bem bobo. Mandei executar um “ls -l” só pra ver se num era um erro maior, meu. Mas rodou perfeito !
O problema está justamente na linha em questão: processo = Runtime.getRuntime().exec("/usr/bin/perl /home/user/prog.pl");
=Z
Sabe de outra forma ?
T
thingol
a) Você consegue executar seu programa com o comando /usr/bin/perl /home/user/prog.pl em um terminal, com o usuário que você está usando para rodar seu programa Java?
b) Você não está precisando redirecionar alguma entrada ou saída?
C
caiocb
A) Consigo perfeitamente.Fiz varios testes pra me certificar disto
B) Também não!
=(
Há pouco, fiz um outro programa em Perl que da um print “teste”; na tela e tentei acessá-lo utilizando o seviço.
Resultado. O serviço conseguiu acessar o arquivo sem problemas. O que me deixa com a pulga atras da orelha é que no terminal o programa executa perfeitamente.