我有一些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中。这是有道理的。感谢大家的帮助......
答案 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
你应该好好去。