我为我的公司创建了这个数据库复制工具,一切都在本地完全可用。我将它 rsync 到我们的工具服务器,现在它似乎无法执行我通过 shell_exec 传递的 shell 命令。
$command = "/usr/bin/mysqldump -v -u$dbUser -p$dbPass ";
$command .= "-h$sourceHost -P$sourcePort $sourceDB 2>../data/dump.log ";
$command .= "| /usr/bin/mysql -u$dbUser -p$dbPass ";
$command .= "-h$targetHost -P$targetPort $targetDB 2>../data/error.log";
$output = shell_exec($command);
我捕获了 mysql 转储的 stderr 输出,因为 mysqldump 实际上使用它来显示进度(转储此表、转储此表等),我从页面上的那个文件中读取以显示进度。
指定的文件都没有被创建。这让我觉得存在某种权限问题。但是我可以看到我的目录都具有与该服务器上其他目录相同的工作工具权限。不排除这种可能性,但我不确定要进一步评估什么。
我尝试将 shell_exec() 更改为 exec() 并添加一个变量来捕获输出 ( exec($command, $shellOutput) ),但 $shellOutput 为空。
在脚本形成命令后,我回显了要运行的命令,并且能够在服务器上毫无问题地运行它。
我在这里有点不知所措,因为它甚至没有给我任何反馈。关于我可以尝试什么的任何想法?
要添加上下文,这是一个由 $.ajax 调用以启动此转储的页面。在这个 shell 命令之后,有一个 db 被复制的回显,并且正在返回。所以页面被正确调用,似乎只是 shell 命令本身根本不起作用。
提前致谢。
*另外值得注意的是,我们的目录结构是我们项目的 www 文件夹符号链接(symbolic link)到服务器的 documentRoot。
最佳答案
你可以试试 system("ur command 2>&1");
这应该有效,如果不输出为什么它不起作用。
关于PHP shell_exec() 没有执行——没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33485257/