Назад | Перейти на главную страницу

Скрипты PHP, SSH2 и Bash не ладят

Я использую библиотеку 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

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

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

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, которую вы используете при входе в систему, может не совпадать при запуске команды через скрипт. Таким образом, некоторая информация, например пути, может быть потеряна.