PHP, SSH2 e Bash Scripts não se entendem

1

Estou usando a biblioteca SSH2 no meu PHP para executar um script SH em um servidor remoto. Quando eu o executo manualmente no SSH, funciona muito bem. No entanto, quando tento executá-lo através do PHP, o script é iniciado, mas nunca é concluído. (O script ecoa o tamanho de dois diretórios e é executado em um loop for ecoando o tamanho até que as duas pastas tenham o mesmo tamanho). Eu tentei colocá-lo em uma tela, correndo com um e comercial para ser executado em segundo plano, deserdado e muito mais.

Aqui está o script inteiro:

echo "starting" > /var/www/html/$2.log
rep='du -sk /home/repository_$1 | awk '{print $1}''
dirsize='du -sk /home/$2 | awk '{print $1}''
while [ "$dirsize" -lt "$rep" ]; do
        dirsize='du -sk /home/$2 | awk '{print $1}''
        echo "New directory size: $dirsize."
        echo "$dirsize\$rep" > /var/www/html/$2.log
        sleep 2;
done
echo "Loop Complete"
echo "done" > /var/www/html/$2.log

Reduzi o travamento para o loop while. Por algum motivo, isso faz com que ele seja bloqueado. Todo o código antes de ser executado corretamente. O script está sendo executado como root e tentei fazer o eco das variáveis do loop while para os arquivos de texto, então sei que eles estão definidos e funcionando corretamente.

    
por DarthCaniac 29.05.2012 / 22:58

2 respostas

3

Essa é outra ideia que eu tive, que é que o loop pode estar perdendo a posição args;

directory1=$1
directory2=$2
echo "starting" > /var/www/html/${directory2}.log
rep='du -sk /home/repository_${directory1} | awk '{print $1}''
dirsize='du -sk /home/${directory2} | awk '{print $1}''
while [ "$dirsize" -lt "$rep" ]; do
        dirsize='du -sk /home/${directory2} | awk '{print $1}''
        echo "New directory size: $dirsize."
        echo "$dirsize\$rep" > /var/www/html/${directory2}.log
        sleep 2;
done
echo "Loop Complete"
echo "done" > /var/www/html/${directory2}.log
  1. tente executar o script como /bin/bash em vez de sh , pois falta sh em alguns recursos (lixo); -)

É provável que o usuário que o php / apache está executando o script não tenha permissão para acessar um ou mais arquivos em seu script, ou que o selinux ou alguma restrição de segurança esteja impedindo que o apache / php inicie o sh intérprete.

experimente $ ps -ef | egrep "(php|httpd|apache)" quando o script estiver rodando para ver se você pode saber com qual usuário o php está sendo executado.

tente executar o script como o usuário do apache assim;

 sudo -u apache /bin/bash -x script.sh arg1 arg2

deve fornecer alguma saída habilitada para depuração para ver onde o problema pode estar.

Se o script estiver sendo executado, mas estiver travado, você poderá usar o strace para ver o que está acontecendo fazendo assim;

# ps -ef | grep sleep
root     24242 22711  0 14:02 pts/0    00:00:00 sleep 10000
root     24249 22711  0 14:03 pts/0    00:00:00 grep sleep

# strace -fp 24242
Process 24242 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...> <unfinished ...>
    
por 29.05.2012 / 23:11
0

Tente usar caminhos completos nos seus comandos. Muitas vezes, o ambiente bash que você está usando quando você faz o login pode não ser o mesmo quando você executa um comando através de um script. Portanto, algumas informações, como caminhos, podem ser perdidas.

    
por 30.05.2012 / 01:06

Tags