Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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
>
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...
>
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 resultadosOla 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
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.
>
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
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.
>
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
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
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
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.
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
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
Seria mais fácil fazer um preloader no momento que clica no link para abrir o programa?
Abraços
Não entendi o que você quis dizer com esse preloader. O que você tem em mente?
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,
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
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?
Tudo vai depender de como esse preloader será feito.
Temos que levar alguns pontos em consideração:
1. O PHP não é multi-thread. Ou seja, algum recurso externo terá que executar o programa. Caso contrário, essa espera será inevitável
2. Quando o preloader será chamado? Qual é o critério que diz que o usuário realmente vai executar o programa? Executá-lo à toa pode consumir recursos sem necessidade, podendo, inclusive, deixar o servidor lento, dependendo do número de usuários naquele momento
Entendi. Vou tentar implementar o seguinte: jogar a saída do programa num arquivo de texto e criar um php p ler e um javascript p ficar verificando o arquivo. Acho que só assim funciona essa m****.
já posto.
Abraços,
Matheus
Se você pode enviar a saída para um arquivo, pode enviar para a saída padrão. Assim o shell_exec recebe essa saída.
$ ./comando 2>&1
Isso redireciona a saída de erros (stderr) para a saída padrão (stdout).
Se o programa permite escolher o arquivo, deve ter a opção para mandar para stdout. É só achar onde definir isso.
Vou dar como resolvido, afinal a dúvida inicial foi respondida.
Flw's
Abraços
tem um "Espaço" entre fastqc /home