PHP、SSH2 和 Bash 脚本不兼容

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 循环。由于某种原因,这会导致它锁定。它之前的所有代码都可以正常执行。该脚本以 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

  1. /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 环境可能与通过脚本运行命令时不同。因此,某些信息(例如路径)可能会丢失。

相关内容