也许你可以帮我解决一个相当令人沮丧的问题。我无法编译可执行文件,让我们称之为$$execprob
,在Linux主机上我正在进行测试,因此在不同的主机上编译它并移动可执行文件。它可以与我的SSH用户一起运行,但是当web服务器使用
exec( "/home/$$username/usr/local/bin/$$execprob", $output, $return );
我没有$output
,$return
是127,或者找不到文件。
以下是我的测试中可能有用的信息列表:
-rwxr-xr-x
。exec( 'ls -l' )
,因为网络服务器显示该文件具有与SSH相同的权限${USER}
是文件所有者$$用户名${USER}
不返回任何内容exec( 'if [-x /home/$$username/usr/local/bin/$$execprob]; then echo "thing";fi' )
打印出'thing'; php -a
的SSH中,输入exec( "/home/$username/usr/local/bin/$$execprob", $output, $return );
正确运行$$ execprob,$output
显示输出,$return
== 0。$LD_LIBRARY_PATH
:export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;
这是可执行文件在使用动态库时运行所必需的。我的.bashrc不是由网络服务器运行的;但是,跑步: exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;
/home/$$username/usr/local/bin/$$execprob", $output, $return );
仍然有相同的不成功结果。
如果我还有其他任何事情可以为您收集更多疑难解答信息,请告知我们。
谢谢!
答案 0 :(得分:0)
问题最终被追溯到$ LD_LIBRARY_PATH环境变量未正确设置。我有这条线:
exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;
/home/$$username/usr/local/bin/$$execprob", $output, $return );
然而,当然,(如上面的@JoelC所述),$HOME
命令中的export
变量将解析为PHP用户的$HOME
。这是通过使用绝对路径修复的:
exec( "export LD_LIBRARY_PATH=/home/$$username/usr/local/lib:$LD_LIBRARY_PATH;
/home/$$username/usr/local/bin/$$execprob", $output, $return );
值得注意的是,绝对没有输出回来帮助诊断这个,这很奇怪。当我在没有设置$$execprob
的情况下从shell运行$LD_LIBRARY_PATH
时,它会返回有关丢失的.so文件的错误。为什么这里的输出不会返回相同的错误?或许系统消息的输出类别与实际命令输出相反?我想知道是否有办法在exec()
范围内返回这些类型的消息。
但我认为这是另一个帖子的问题......