php exec bash脚本:没有这样的文件或目录
我有一些bash和perl脚本,它们被要求通过基于web的界面执行。没什么特别的,只是为了方便取用。 PHP似乎是快速而肮脏的解决方案[通过php exec bash脚本:没有这样的文件或目录,php,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脚本中访问的任何文件(通过相对路径
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输出被推送到错误日志文件时,“done”永远不会传递到$output数组。当在第页上打印时,exec()的第三个参数中的返回值给出了0
更新:
time
命令将其输出到stderr,如果这样做`
t=`time some_command 2>&1`
然后在t中也没有存储任何内容。所以这是有道理的。感谢大家的帮助…将当前工作目录更改为脚本本身的一部分 从
RUN.sh
脚本的角度来看,您的工作目录并不是您想象的那样。因此,脚本中的相对路径不会指向预期的位置
要修复它,您需要强制当前工作目录为使用相对路径的目录。因此,要么:
- 使用绝对路径,或
- 通过调用
脚本中的RUN.sh
更改当前工作目录,以强制其正确cd[/absolute/path]
exec()
之前,能否在PHP脚本中执行chdir(2)
调用以获得所需的结果?或者这会不会让你的PHP解释器太难过?(使用CGI脚本,这一点都没有问题;但是FastCGI或类似的机制可能不太喜欢您。)
依赖相对路径名已经有点快和脏了,这只会使它永久化。也许修复脚本是更好的方法
编辑
我被重定向到
error\u 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
因此,替换该行:
/usr/bin/time -p python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits 2>&1
用这句话:
/usr/bin/time -p python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits 2>&1
你应该准备好了。你应该为
RUN.sh
设置工作目录。您可以在exec
之前使用chdir
,或者使用exec-cd-WORKING\u目录/运行.sh
.Aah。。。嗯。。我快到了。。。RUN.sh中有一个时间
,其输出应转到网页。但它不是这样工作的,输出被重定向到/var/log/httpd/error\u log
。它一直打印Array()数组(0){}
,就好像什么都没发生一样!嗯,你能把真实的剧本贴到某个地方让我仔细看看吗?更新了原来的帖子。。。感谢@normalocityI的帮助,我被重定向到错误日志而不是php页面的输出所困扰,知道为什么吗?