PHP,SSH2和Bash脚本不相处

我在我的PHP中使用SSH2库在远程服务器上执行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循环的崩溃。 出于某种原因,导致它locking。 所有的代码在执行之前就好了。 该脚本正在执行作为根,我已经试图呼应从while循环出来的文本文件的variables,所以我知道他们设置和正常工作。

这是我的另一个想法,那就是循环可能会失去位置参数;

 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缺less一些function(垃圾);-)

php / apache运行脚本的用户很可能没有权限访问脚本中的一个或多个文件,或者selinux或某种安全限制阻止了apache / php启动sh解释器。

试试$ ps -ef | egrep "(php|httpd|apache)" $ ps -ef | egrep "(php|httpd|apache)"当脚本运行时,看看是否可以捕捉到php运行的是哪个用户。

尝试像这样的Apache用户运行脚本;

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

应该提供一些启用debuggingfunction的输出来查看问题出在哪里。

如果脚本正在运行,但是卡住了,可以使用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 ...> 

尝试在命令中使用完整path。 当您通过脚本运行命令时,通常您login时使用的bash环境可能不一样。 所以一些信息,比如path,可能会丢失。