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