我正在使用 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 循环中的变量回显到文本文件中,因此我知道它们已设置并正常工作。
答案1
这是我的另一个想法,即循环可能会丢失位置参数;
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 ...>
答案2
尝试在命令中使用完整路径。通常,登录时使用的 bash 环境可能与通过脚本运行命令时不同。因此,某些信息(例如路径)可能会丢失。