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