【问题标题】:Live output of shell script using `watch` in browser?在浏览器中使用`watch`实时输出shell脚本?
【发布时间】:2014-10-09 04:48:03
【问题描述】:

我见过PHP reading shell_exec live outputPHP: Outputting the system / Shell_exec command output in web browser,但无法进行以下操作。

注意:最初,我的 shell 脚本运行的是一些 python,但我已经对其进行了简化。

live.sh

uname -a
date
watch --no-title date

live.php

<?php
$cmd = "sh live.sh";

while (@ ob_end_flush()); // end all output buffers if any

$proc = popen($cmd, 'r');
echo '<pre>';
while (!feof($proc))
{
    echo fread($proc, 4096);
    @ flush();
}
echo '</pre>';
?>

unamedate 输出在浏览器中显示正常,但 watch 输出没有。

我实际上是在尝试不可能的事情吗?

【问题讨论】:

  • 如果你真的需要一个服务器进程的输出来替换之前渲染的文本,我想你会需要Ajax。
  • 从 python 进程捕获输出时,您需要禁用输出缓冲:python -u /path/to/watch ...PYTHONUNBUFFERED=1 watch ...
  • @JasperN.Brouwer 你是传奇,它对我有用。

标签: php apache shell


【解决方案1】:

我建议不要使用手表的方法,你可能会遇到比你想象的更多的麻烦。

首先,长时间运行的命令可能会受到(默认)PHP 超时的影响,因此您可能需要对其进行调整。

然后,watch 可能使用终端序列来清除屏幕,我不确定这如何转换为输出代码。

我宁愿建议设置客户端机制来定期重复调用服务器端live.php。

这篇关于 SO 的帖子将帮助您入门。 jQuery, simple polling example

上面的页面使用 jquery 库,但如果你愿意,你可以使用原生 Javascript 等效项。

最简单的例子(来自那个页面)是:

function poll(){
    $("live.php", function(data){
        $("#output_container").html(data);
    }); 
}

setInterval(function(){ poll(); }, 5000);

在您的页面中,为您的结果设置一个容器

<div id="output_container"></div>

在您的示例中,您从脚本中删除监视并将其替换为您打算监视的命令。

【讨论】:

    【解决方案2】:

    您可能只需要一些特殊的东西。所以,对于那些你可以试试ajaxterm

    真的好用,(4.line安装)

    wget http://antony.lesuisse.org/software/ajaxterm/files/Ajaxterm-0.10.tar.gz
    tar zxvf Ajaxterm-0.10.tar.gz
    cd Ajaxterm-0.10
    ./ajaxterm.py
    

    您将获得 full bash 在浏览器中以交互方式运行。 (在登录名/密码之后)。用python编写,很容易适应你。另外,see here

    【讨论】:

    • 我可能不会将它用于这个确切的问题,但了解它非常有用,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多