Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matheus Brito

Problema com shell_exec

Recommended Posts

Boa Noite a todos. Tenho uma pagina index.php que chama um programa externo, mas esse programa vai ser executado no modo nao interativo. Pelo terminal funciona 100% com o seguinte codigo: /home/matheus/FastQC/fastqc /home/matheus/exemplo1.fastq , entretanto quando jogo esse bloco de codigo no arquivo php nao funciona.

function callFastQc(){
	
	$output = shell_exec('/home/matheus/FastQC/fastqc /home/matheus/exemplo1.fastq');
	
	//echo "$output";			
}

E o log, contem o seguinte:

 

Skipping '/home/matheus/exemplo1.fastq' which didn't exist, or couldn't be read

 

Ou seja parece que o problema esta no caminho, mas nao vejo como pois pelo terminal funciona de boas.

 

Vlw

 

* perdoem-me pelos acentos, to usando uma VM e ainda nao configurei o teclado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem um "Espaço" entre fastqc /home

Olá, Boa Noite são 2 parâmetros, o primeiro é o programa a ser executado e o segundo é o arquivo que ele lerá.

 

Atenciosamente,

 

Matheus

Compartilhar este post


Link para o post
Compartilhar em outros sites

E o log, contem o seguinte:

 

Skipping '/home/matheus/exemplo1.fastq' which didn't exist, or couldn't be read

Que log é esse? É gerado pelo fastq?

 

Descomente o echo em $output e veja se aparece alguma mensagem de erro além da que você postou.

 

É estranho ter falhado ao encontrar o arquivo, pois você usa path completos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que log é esse? É gerado pelo fastq?

 

Descomente o echo em $output e veja se aparece alguma mensagem de erro além da que você postou.

 

É estranho ter falhado ao encontrar o arquivo, pois você usa path completos...

Boa Noite Beraldo. Esse log é o do php. Não tem diferença comentado ou descimentado o $output já testei. O estranho é isso eu uso path completos justamente para não ter problemas e acabei tendo.

 

Abraços,

 

Matheus

 

 

 

------------------

 

Post de: Beraldo

 

Então vamos tentar cercar o problema.

Rode estes dois comandos:

 

echo shell_exec('ls -ld /home/matheus/FastQC/fastqc');

 

echo shell_exec('ls -ld /home/matheus/exemplo1.fastq');

Poste os resultados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Beraldo, segue abaixo a saida dos dois comandos:

 

-rwxrwxrwx 1 matheus matheus 13775 Nov 20 09:25 /home/matheus/FastQC/fastqc
-rw------- 1 matheus matheus 398456845 Jan 27 10:51 /home/matheus/exemplo1.fastq

Abracos,

 

Matheus

Compartilhar este post


Link para o post
Compartilhar em outros sites

O arquivo /home/matheus/exemplo1.fastq está com permissão 600 (rw-------) e só o usuário "matheus" pode lê-lo ou escrever nele.

A permissão correta depende do usuário que roda o servidor Web. Teste com 644. Se o usuário do servidor web estiver no mesmo grupo que o seu, 640 pode ser suficiente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O arquivo /home/matheus/exemplo1.fastq está com permissão 600 (rw-------) e só o usuário "matheus" pode lê-lo ou escrever nele.

A permissão correta depende do usuário que roda o servidor Web. Teste com 644. Se o usuário do servidor web estiver no mesmo grupo que o seu, 640 pode ser suficiente.

 

Eu dei o chmod 644 -R pelo terminal e funcionou a aplicacao enxergou o arquivo, porem eu fiquei com outras duvidas:

 

Assim que acabou de processar a leitura do arquivo ele deu um exception porque, acredito que nao conseguiu criar um arquivo no disco, porque ele cria um arquivo no disco com o mesmo nome so que nao extensao .zip, como pode ser visto pelo log abaixo:

Started analysis of exemplo1.fastq
Approx 5% complete for exemplo1.fastq
Approx 10% complete for exemplo1.fastq
Approx 15% complete for exemplo1.fastq
Approx 20% complete for exemplo1.fastq
Approx 25% complete for exemplo1.fastq
Approx 30% complete for exemplo1.fastq
Approx 35% complete for exemplo1.fastq
Approx 40% complete for exemplo1.fastq
Approx 45% complete for exemplo1.fastq
Approx 50% complete for exemplo1.fastq
Approx 55% complete for exemplo1.fastq
Approx 60% complete for exemplo1.fastq
Approx 65% complete for exemplo1.fastq
Approx 70% complete for exemplo1.fastq
Approx 75% complete for exemplo1.fastq
Approx 80% complete for exemplo1.fastq
Approx 85% complete for exemplo1.fastq
Approx 90% complete for exemplo1.fastq
Approx 95% complete for exemplo1.fastq
Failed to process file exemplo1.fastq
java.io.FileNotFoundException: /home/matheus/exemplo1_fastqc.zip (Permission denied)
	at java.io.FileOutputStream.open0(Native Method)
	at java.io.FileOutputStream.open(FileOutputStream.java:270)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
	at uk.ac.babraham.FastQC.Report.HTMLReportArchive.<init>(HTMLReportArchive.java:80)
	at uk.ac.babraham.FastQC.Analysis.OfflineRunner.analysisComplete(OfflineRunner.java:155)
	at uk.ac.babraham.FastQC.Analysis.AnalysisRunner.run(AnalysisRunner.java:110)
	at java.lang.Thread.run(Thread.java:745)

Ai pensei que era permissao de escrita e dei logo um chmod 775 -R pelo terminal, mas nao resolveu o problema. Outra duvida todo o processamento ta acontecendo no log, quero que seja mostrado na aplicacao para que o usuario tenha acesso do que ta acontecendo.

 

Vlw Beraldo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente com 777 pra ver se é esse o problema. Mas não recomendo deixar 777.

O ideal é colocar o usuário do servidor no mesmo grupo que o usuário dono da pasta onde o arquivo será escrito. Aí 775 resolve.

 

Sobre o retorno, a variável $output do seu exemplo deve retornar o conteúdo da saída do programa. Basta dar um echo nela onde quiser que os logs sejam exibidos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente com 777 pra ver se é esse o problema. Mas não recomendo deixar 777.

O ideal é colocar o usuário do servidor no mesmo grupo que o usuário dono da pasta onde o arquivo será escrito. Aí 775 resolve.

 

Sobre o retorno, a variável $output do seu exemplo deve retornar o conteúdo da saída do programa. Basta dar um echo nela onde quiser que os logs sejam exibidos.

Eu to executando de uma VM aqui mesmo no meu PC. Então achei que o 775 iria funcionar. Sobre a variável $outuput eu deixei ela descomentada e a única coisa que saiu foi Analysis complete for example1.fastq. Mas não mostrou o progresso como é mostrado no log.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não funcionou com 777 ele continua sem permissão para escrever o arquivo no disco. E por isso o programa falha não consegue terminar a execução, como pode ser observado no trecho:

Approx 95% complete for exemplo1.fastq
Failed to process file exemplo1.fastq
java.io.FileNotFoundException: /home/matheus/exemplo1_fastqc.zip (Permission denied)

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, quando criei uma pasta dentro de /home/matheus e coloquei o arquivo exemplo1.fastq dentro e dei permissão na pasta pelo modo gráfico do ubuntu no grupo other, dei permissão de create and delete funcionou, mas sei que não posso deixar com essas configurações de permissão. Outra coisa ainda não deu certo mostrar o progresso do programa na página index.php, será que tenho que usar o pipe jogando em outra variável?

 

Abraços,

 

Matheus

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o programa escreve em /home/matheus, essa pasta preisa ter permissão de escrita para o usuário que roda o servidor web. Não tem como fugir disso.

Como eu comentei, normalmente deixamos nosso usuário no mesmo grupo do usuário que roda o servidor, assim não precisa dar permissão de escrita para Others, apenas para o Grupo.

 

Talvez este meu artigo sobre CHMOD lhe seja útil: http://rberaldo.com.br/chmod-permissoes-em-sistemas-linux-e-unix-like/

 

Sobre o log, shell_exec retorna a saída do programa. Nada mais que isso. Então, pelo que entendi, no seu caso é preciso configurar esse programa para jogar o log pra saída padrão, que será capturada pelo shell_exec.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faço isso? Não tenho como mexer no programa que estou chamando? Se eu conseguisse que mostrasse na página .php o que ta saindo no log já seria util. Porque assim que o programa eh chamado o navegador fica estático até o programa terminar de executar, mas o usuário fica sem um feedback. Como posso resolver isso?

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso depende do programa. Não conheço esse FastQC, mas talvez haja uma opção pra torná-lo verbose ou pra jogar os logs pra stdout ou stderr, em vez de escrever no arquivo de logs.

 

Se não existir, a alternativa é fazer o script PHP ler o arquivo de logs do FastQC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria mais fácil fazer um preloader no momento que clica no link para abrir o programa?

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

A saída que aparece no log do php não aparece na minha página, então pensei o seguinte: O único problema é meu usuário ficar esperando o tempo de execução do programa sem nenhuma resposta enquanto isso acontece. Por esse motivo pensei no seguinte, se houver um preloader no momento que o usuário clica no link para chamar o programa não resolveria?

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei como isso poderia evitar o tempo de espera.

O PHP, por padrão, exibe a saída de uma só vez. Ou seja, ele armazena o buffer de saída e só o envia para o cliente quando a execução termina.

Mas dá pra controlar isso com flush() e as outras Funções de controle de buffer. Talvez ajude. Porém, acho que shell_exec vai esperar a execução completa do programa externo para enviar a saída pro PHP

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas o objetivo do preloader seria simplesmente para não deixar ele esperando o tempo até o shell_exec jogar na tela a saída. Seria uma simples distração. Acha que funciona?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.