任何从网页执行bash脚本并在执行时捕获输出的方法

Any way to execute a bash Script from Webpage and Catching the Output while it executes?

本文关键字:执行 输出 方法 网页 bash 脚本 任何      更新时间:2023-09-26

我在我的Ubuntu 10.04服务器上得到了一些长时间运行的bash脚本,这些脚本正在做备份和数据库转储等事情。

我目前正在通过cron执行它们并将结果邮寄给我。不过,如果能通过web界面手动触发它们就更好了。(我不想给任何用户SSH访问权限,这样他就可以触发脚本)

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

正如我注意到的,例如,Webmin在通过其webinterface运行apt之类的系统命令时就会这样做。

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

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

任何想法都非常感谢!

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

在过去,我用Jenkins来做这类事情。您可以使用它作为cron替代作为手动触发脚本的一种方式,同时保留发生的日志。

Jenkins可以设置为一些用户只有触发作业的权限,而不是Jenkins管理员可以做像设置和编辑作业之类的事情。

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

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

http://www.webmin.com/

的优点是你所要求的东西是内置的,你不需要编写任何程序。

PHP中的

应该看

缓冲区和刷新。您基本上可以在接收到输出时输出到页面。

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

请参阅popen系统的相关问题

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

数据库表非常简单,只有

列。

id(auto increment)

log_text

script_identifier(如果跟踪多个脚本是唯一的)

last_modified_time

output_display (value = 0告诉ajax没有读取这个输出)

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

你可以在很多方面提高,比如使用apc或memcached代替数据库表保持日志表较小,或者为每个脚本动态创建日志表