【问题标题】:Any way to execute a bash Script from Webpage and Catching the Output while it executes?有什么方法可以从网页执行 bash 脚本并在执行时捕获输出?
【发布时间】:2013-03-19 17:39:38
【问题描述】:

我的 Ubuntu 10.04 服务器上有一些长时间运行的 bash 脚本,它们执行备份和数据库转储等操作。

我目前正在通过 cron 执行它们并将结果邮寄给我。但是,另外在 Web 界面中手动触发它们会很好。 (我不想给任何用户 SSH 访问权限,以便他可以触发脚本)

例如,在 PHP 中,有 exec 命令在脚本完成后获取脚本输出。这没有用,因为脚本持续时间超过 30 秒浏览器超时。 (而且我想监控进度)所以我目前一直在寻找一种方法来定期收集脚本输出或“拖尾”并通过 JavaScript 或 Pagereloads 或类似的东西显示它。

正如我所注意到的,例如,当您通过 Web 界面运行 apt 等系统命令时,Webmin 会以某种方式执行此操作。

我可以想象的一种方法是分叉脚本执行并将输出重定向到一个文件,而主进程正在页面重新加载/Ajax 请求上读取它。但这听起来像是一种解决方法:)

那么,有没有人对这个问题有好的解决方案?不需要是 PHP,也可以是 python 或 perl 或服务器端的其他任何东西。或者有这样的工具或库吗?

任何想法都非常感谢!

【问题讨论】:

标签: php javascript ajax bash shell


【解决方案1】:

我不确定您的解决方案是否需要 PHP,但如果不是……

过去,我用Jenkins 处理这种事情。您可以将它用作 cron 替换作为手动触发脚本的一种方式,同时保留所发生事件的日志。

Jenkins 可以设置为仅允许某些用户触发作业,而 Jenkins 管理员可以执行诸如设置和编辑作业等操作。

如果您喜欢接收电子邮件,Jenkins 也可以这样做。如果有的话,Jenkins 最大的缺点是它超级灵活/可配置,因此如何最好地设置它以满足一个人的特定需求并不总是显而易见的。

【讨论】:

  • 啊,好主意,我对 Jenkins 很熟悉,但没有想出用它来执行脚本。无论如何,詹金斯可能只是触发一个脚本(并向用户解释它)有点开销。但这是一个非常好的主意!
  • hmmm 一直认为 jenkins 更像是一个 CI 代码测试/构建服务器工具。
  • 我也是,所以我也没赶上这个。但它内置了 cron 功能,除了 ant 或 maven 目标之外,它还可以执行系统命令。所以这可能是一起做这一切的一种优雅的方式。我会看看我可以将匿名用户配置文件限制到多远,然后可能会尝试使用 Jenkins!
【解决方案2】:

任何语言都可以。我可以推荐 Webmin 的大锤方法。

http://www.webmin.com/

优点是您所要求的内容已包含在内,您无需编写任何内容。

在php中你应该看看

缓冲和冲洗。您基本上可以在收到输出时输出到页面。

http://php.net/manual/en/function.ob-start.php

查看有关 popen 语法的相关问题。

php shell_exec with realtime updating

【讨论】:

  • 好吧,如果你真的想做 webmin 做的事情,最好使用 webmin :D 但我不想让用户访问我的系统(这就像给他们 ssh 访问权限) ,所以 webmin 可能不是正确的方法。感谢您对 PHP 的提示,我会看看这个!
  • 我认为您可以创建一个非常有限的用户帐户并限制 webmin 可以做什么......这只是一个想法;)
【解决方案3】:

我做了类似的事情(快速而肮脏但可能不是很有效) 我使用数据库日志表来存储输出(来自后端脚本) 然后,网页会定期发出 ajax 请求,以仅获取以前未获取的日志并将其显示(附加)到前端。

数据库表非常简单,有列

id(自动递增)

日志文本

script_identifier(如果您跟踪多个脚本,则为唯一)

last_modified_time

output_displayed(value = 0 表示该输出未被 ajax 读取)

一个简单的过程是这样的 打开网页并单击按钮发送ajax请求以启动后端脚本 每 5 秒发送另一个 ajax 请求,查看是否有未读的日志表行 如果有未读行,标记为已读,取出并显示

您可以在很多方面有所改进,例如 使用 apc 或 memcached 代替数据库表 保持日志表较小或为每个脚本动态创建日志表

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 2017-07-17
    • 2015-08-22
    • 2010-10-02
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多