我在我的 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 循环。出于某种原因,这会导致它锁定。执行之前的所有代码都很好。该脚本以 root 用户身份执行,我尝试将 while 循环中的变量回显到文本文件中,因此我知道它们已设置并正常工作。
这是我的另一个想法,即循环可能会丢失位置参数;
/bin/bash
而不是sh
,因为sh
缺少某些功能(垃圾);-)运行脚本的 php/apache 用户可能没有访问脚本中一个或多个文件的权限,或者 selinux 或某些安全限制阻止了 apache/php 启动
sh
解释器。尝试
$ ps -ef | egrep "(php|httpd|apache)"
在脚本运行时查看是否可以捕获正在运行的用户 php。尝试像这样以 apache 用户身份运行脚本;
应该提供一些启用调试的输出以查看问题可能出在哪里。
如果脚本正在运行,但卡住了,您可以使用 strace 来查看卡住的原因;
尝试在命令中使用完整路径。通常,您登录时使用的 bash 环境可能与您通过脚本运行命令时使用的环境不同。所以一些信息,比如路径,可能会丢失。