PHP, SSH2 и Bash Scripts не ладят

Я использую библиотеку SSH2 в своем PHP для выполнения сценария SH на удаленном сервере. Когда я запускаю его вручную по SSH, он работает просто отлично. Однако, когда я пытаюсь запустить его через PHP, скрипт запускается, но никогда не завершается. (Сценарий отображает размер двух каталогов и запускается в цикле for, отображая размер до тех пор, пока две папки не будут одинакового размера.). Я попытался поместить его в экран, запустить с амперсандом, чтобы работать в фоновом режиме, отрекся от него и многое другое.

Вот весь сценарий:

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

Я сузил крушение до цикла пока. По какой-то причине это приводит к его блокировке. Весь код до того, как он выполняется просто отлично. Сценарий выполняется от имени пользователя root, и я попытался отобразить переменные из цикла while в текстовые файлы, поэтому я знаю, что они установлены и работают правильно.

2 ответа

Решение

Это еще одна идея, которая у меня возникла: цикл может потерять аргументы позиции;

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. попробуйте выполнить скрипт как /bin/bash скорее, чем sh, как sh не хватает некоторых функций (мусор);-)

Вероятно, что пользователь, который запускает скрипт php / apache, не имеет разрешения на доступ к одному или нескольким файлам в вашем скрипте, или что selinux или какое-то ограничение безопасности препятствует запуску apache / php sh переводчик.

пытаться $ ps -ef | egrep "(php|httpd|apache)" когда скрипт запущен, чтобы увидеть, можете ли вы поймать, какой пользователь работает под php.

попробуйте запустить скрипт от имени пользователя apache;

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

должен предоставить некоторые выходные данные с поддержкой отладки, чтобы увидеть, где может быть проблема.

Если скрипт работает, но застрял, вы можете использовать strace, чтобы взглянуть на то, что застряло, делая так;

# 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 ...>

Попробуйте использовать полные пути в ваших командах. Часто среда bash, которую вы используете при входе в систему, может не совпадать при запуске команды через скрипт. Таким образом, некоторая информация, такая как пути, может быть потеряна.

Другие вопросы по тегам