为什么可执行文件只有在作为HTTP请求运行时才找不到共享库

时间:2019-04-01 02:14:27

标签: php linux bash shell exec

我有一个具有shell_exec调用的php文件。 shell_exec函数运行一个.sh文件。

#!/bin/bash

filename=$(ls *.jpg -Art | tail -n 1)
codegen_dir=/usr/local/codegen/

cd "$codegen_dir"
out=$(./classifier /var/www/$filename)
echo $out

可执行文件'classifier'存在于codegen_dir中,并且具有1个共享库依赖项。该脚本从命令行正确运行。 php文件也可以从命令行正确运行。但是,当我将php文件作为http请求运行时,我在std_err中得到以下内容:

“。/分类器:加载共享库时出错:libreader.so:无法打开共享库文件:没有这样的文件或目录”

.so文件与可执行文件位于同一目录中

我的php服务器根目录是:/ var / www

  • 服务器根目录中的所有文件均具有以下权限:-rwxrwxrwx 1 www-data www-data
  • 'codegen_dir'中的所有文件都具有权限:-rwxrwxrwx 1个Ubuntu www-data
  • 我能够读取codegen_dir中的其他文件

1 个答案:

答案 0 :(得分:0)

apache用户可能无法访问共享的库路径。您可以在sudoers文件中为apache允许分类器程序,并使用sudo以apache用户身份运行分类器应用程序

或  更改共享的权限,使所有用户都可以访问共享的libraray及其路径

out=$(sudo ./classifier /var/www/$filename)

尝试使用apache用户登录并运行上述脚本,或者尝试访问共享的lib

su -s /bin/bash apache