我在Ubuntu 10.04服务器上运行了一些长时间运行的bash脚本,这些脚本执行备份和数据库转储等操作。
我正在通过cron执行它们并将结果邮寄给我。但是,另外在整个Web接口中手动触发它们会很不错。 (我不想给任何用户SSH访问权限以便他可以触发脚本)
例如,在PHP中,有一个exec命令可以在脚本完成后获取脚本输出。这没有用,因为脚本持续时间超过30秒浏览器超时。 (我想要监控进度)所以我目前一直在寻找一种方法来定期收集脚本输出或“拖尾”并通过JavaScript或Pagereloads或类似的方式显示它。
正如我所注意到的,例如,当您通过Web界面运行apt等系统命令时,Webmin就会以某种方式执行此操作。
我可以想象的一种方法是分支脚本执行并将输出重定向到文件,而主进程则在页面重载/ Ajax请求上读取它。但这听起来像是一种解决方法:)
那么,有没有人有这个问题的好解决方案?不需要是PHP,也可以是python或perl或服务器端的任何其他东西。或者是否有这样的工具或库?
任何想法都非常感谢!
答案 0 :(得分:2)
我不确定您的解决方案是否需要PHP,但如果不是......
过去,我曾使用Jenkins来做这种事情。您可以将它用作cron替换和作为手动触发脚本的方法,同时保留所发生事件的日志。
Jenkins可以设置为某些用户只有权限才能触发作业,而Jenkins管理员可以执行设置和编辑作业等操作。
如果你喜欢收到电子邮件,詹金斯也可以这样做。如果有的话,Jenkins的最大缺点是它非常灵活/可配置,因此并不总是很明显如何最好地满足一个人的特殊需求。
答案 1 :(得分:1)
任何语言都可以。我可以推荐使用Webmin的大锤方法。
优点是你要求的是烘焙,你不必编程任何东西。
在php中你应该看看缓冲和冲洗。您可以在收到输出时基本输出到页面。
http://php.net/manual/en/function.ob-start.php
请参阅popen sytax的相关问题。
答案 2 :(得分:0)
我做了类似的事情(快速而肮脏,但效率可能不高) 我使用数据库日志表来存储输出(从后端脚本) 然后,网页会定期发出ajax请求,只获取之前未提取的日志,并将其显示(附加)到前端。
数据库表非常简单,列
id(自动增量)
log_text
script_identifier(如果您要跟踪多个脚本,则为唯一的)
LAST_MODIFIED_TIME
output_displayed(value = 0表示ajax尚未读取此输出)
一个简单的过程就是这样的 打开网页并单击按钮发送ajax请求以启动后端脚本 每隔5秒发送另一个ajax请求,以查看是否有未读的日志表行 如果有未读行,请将它们标记为已读,然后获取它们并显示
你可以改进很多东西,比如 使用apc或memcached而不是数据库表 保持日志表较小或动态创建每个脚本的日志表