2

我在我的 Ubuntu 10.04 服务器上运行了一些长时间运行的 bash 脚本,这些脚本正在执行诸如备份和数据库转储之类的操作。

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

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

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

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

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

任何想法都非常感谢!

4

3 回答 3

2

我不确定您是否打算在您的解决方案中使用 PHP,但如果不是……</p>

过去,我曾将Jenkins用于此类事情。您可以将它用作 cron 替代品手动触发脚本的一种方式,同时保留所发生事件的日志。

可以设置 Jenkins,使某些用户只有触发作业的权限,而 Jenkins 管理员可以执行诸如设置和编辑作业等操作。

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

于 2013-03-19T17:44:31.117 回答
1

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

http://www.webmin.com/

优点是您要求的内容已被烘焙,您无需编写任何程序。

在php中你应该看看

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

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

有关 popen 语法,请参阅此相关问题。

php shell_exec 实时更新

于 2013-03-19T17:44:19.683 回答
0

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

数据库表非常简单,有列

id(自动递增)

日志文本

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

上次修改时间

output_displayed (value = 0 表示这个输出没有被 ajax 读取)

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

您可以在许多方面进行改进,例如使用 apc 或 memcached 而不是数据库表 保持日志表较小或为每个脚本动态创建日志表

于 2013-03-19T18:00:01.830 回答