php exec bash脚本:没有这样的文件或目录

时间:2011-10-16 02:33:20

标签: php

我有一些bash和perl脚本已被要求通过基于Web的界面实现可执行。没什么特别的,只是为了方便访问。 PHP似乎是[通过exec()]的快速而肮脏的解决方案。所以我在php.ini中关闭了安全模式并尝试了

$output = array();
exec('/var/www/vhosts/default/htdocs/scripts/RUN.sh',$OUTPUT);
print_r($output);
var_dump($output);

现在无法在RUN.sh脚本中访问任何文件(通过相对路径访问)。有没有办法让这个工作没有给出在脚本中访问的每个重定向(或任何文件)的完整路径?


应用已接受的解决方案后:

说出一行代码:

time python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits
echo "done"

time - s输出被推送到error_log文件时,“done”永远不会传递给$ OUTPUT数组。 exec()的第三个参数中返回的值,在页面上打印时会显示0


更新: time命令将它发送到stderr,所以如果做`

t=`time some_command 2>&1`

然后也没有任何东西存储在t中。这是有道理的。感谢大家的帮助......

2 个答案:

答案 0 :(得分:2)

将当前工作目录更改为脚本本身的一部分。

RUN.sh脚本的角度来看,您的工作目录并不是您认为的那样。因此,脚本中的相对路径不指向预期的位置。

要修复它,您需要强制当前工作目录是与相对路径一起使用的目录。所以,要么:

  • 使用绝对路径,或
  • 通过调用cd [/absolute/path]脚本中的RUN.sh来更改当前工作目录,以强制它正确。

答案 1 :(得分:1)

您可以在chdir(2)来电之前立即在PHP脚本中执行exec()调用,以获得所需的结果吗?或者这会让你的PHP解释器太过烦恼吗? (使用CGI脚本,它根本不是问题;但是FastCGI或类似机制可能不太喜欢你。)

依赖相对路径名已经有点快速和肮脏,这只会使它永久化。也许修复脚本是一种更好的方法。

修改

  

我坚持将输出重定向到error_log而不是php页面,知道为什么?

这是程序将其输出发送到标准错误而不是标准输出的症状。

time存在并发症 - 通常,当您运行time时,您会获得bash(1)内置time保留关键字。我找不到任何简单的方法来让bash(1)time保留关键字输出发送到不同的文件描述符。但是,您也可以运行time(1)程序(位于/usr/bin/time中)。默认情况下,time(1)的输出会转到标准错误,但您可以根据需要重定向输出:

$ /usr/bin/time echo hello
hello
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 2528maxresident)k
0inputs+0outputs (0major+206minor)pagefaults 0swaps
$ /usr/bin/time echo hello > /dev/null
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 2544maxresident)k
0inputs+0outputs (0major+207minor)pagefaults 0swaps
$ /usr/bin/time echo hello > /dev/null 2&>1
$ 

要使time(1)输出看起来更像是在关键字输出中构建的time shell,您可以使用-p选项:

$ /usr/bin/time -p echo hello
hello
real 0.00
user 0.00
sys 0.00

所以,更换一行:

time python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits

行:

/usr/bin/time -p python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits 2>&1

你应该好好去。