Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用异步脚本获取tail -f结果?

如何使用异步脚本获取tail -f结果?
EN

Stack Overflow用户
提问于 2019-02-09 12:45:01
回答 3查看 377关注 0票数 3

我有一个PHP页面,我想在其中显示最近3秒内新添加到日志文件中的行。目前,我正在使用PHP函数运行jQuery文件,该文件将运行shell_exec。

我正在使用这些脚本:

主页上的jQuery:

代码语言:javascript
运行
AI代码解释
复制
setInterval(function(){
    $.get('tailer.php', function(data) {
        alert(data);
    });
}, 3000);

tailer.php:

代码语言:javascript
运行
AI代码解释
复制
<?php
    $result = shell_exec("timeout 3s sudo tail -f log.txt");
    echo $result;
?>

问题是,当我从命令行运行tailer.php脚本时,它会按预期返回行。但是,当使用浏览器运行同一文件时,它不会停止加载,也不会返回任何内容。因此,PHP主页面中的脚本不会发出任何警告。

我能够缩小问题的范围,并注意到当从-f命令中删除尾部开关时,一切都很好。仅-f交换机出现问题。你能帮帮忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-10 11:22:41

不知道具体原因,但在将sudo移动到timeout命令之前后,问题得到了解决。最终工作的tailer.php内容如下所示:

代码语言:javascript
运行
AI代码解释
复制
<?php
    $result = shell_exec("sudo timeout 3s tail -f log.txt");
    echo $result;
?>
票数 0
EN

Stack Overflow用户

发布于 2019-02-09 14:00:41

当我第一次开始编写web应用程序时,我也使用了这种技术,JS - PHP - BASH。这不是最好的方法,您应该考虑使用PHP (或Node)来处理bash现在正在做的所有服务器端工作。

我不记得你有(我也有)这个问题的原因是什么,但这个解决方案对我很有效:

在您的tailer.php中,使用以下代码:

代码语言:javascript
运行
AI代码解释
复制
<?php
 exec("/bin/bash -c 'tail -f log.txt'", $output, $return_var);
 echo $output
?>

$return_var是bash脚本的退出状态,我认为$output将保存bash脚本的返回值。

您能向我展示来自AJAX的响应(在dev-tools Network部分中找到)吗?

如果什么都没有,你可以将echo $output切换为echo $return_var,这样我们就可以看到退出的bash cmd是真是假。

:-)

票数 0
EN

Stack Overflow用户

发布于 2019-02-09 14:05:38

第一个问题

PHP引擎在请求到来时执行php代码,并在执行完成时返回php代码的输出(您仍然可以使用flush函数手动刷新输出缓冲区)。似乎你的php代码在执行shell脚本时被阻塞(等待)。

第二个问题

我建议编写一个运行后台的脚本,将文件更改放到Redis中,并使用ajax查询Redis以进行更新。如果你想要纯php代码,我找不到一个合理的解决方案(PHP不是长连接的最佳工具)。

顺便说一下,当建立多个连接时,将同时执行多个shell脚本,这对于这样的文件监视作业是不够的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54606337

复制
相关文章
Discourse 修改上传附件的大小
官方的帖子在:Change the maximum attachment/upload size - sysadmin - Discourse Meta 页面中。
HoneyMoose
2023/06/14
2970
Discourse 修改上传附件的大小
织梦dede修改附件图片储存路径
在用织梦建站时,在运营网站一段时间后,会发现织梦默认的图片上传路径有问题,织梦默认保存图片附件是按照日期来建目录,路径为uploads/allimg/171008/ ,网站每天都上传图片,时间长了uploads/allimg就有太多的目录了
用户8851537
2021/07/20
3.3K0
Emlog文章列表获取附件(图片)数量方法
本方法实际获取的是文章附件的数量,而非只是图片的数量,如果你的文章含有文件附件,列表也会显示成图片数量。所以此方法最适合于文章图片特别多而且没有附件的博客。Emlog文章列表获取附件(图片)数量,方法过于简单,修改博客emlog模板文件步骤如下:
用户8099761
2023/05/10
4330
NetCMS修改之二:单击新闻附件,直接打开文件「建议收藏」
NetCMS系统的新闻附件,是通过down.aspx页面实现下载附件的。这样做的好处可能是可以隐藏附件的真实地址,但给用户使用会带来一个小麻烦:无法使用右键单击来实现将下载的文件另存为。
全栈程序员站长
2022/11/11
3660
abstract修改方法
抽象的方法是要让子类继承下去再定义它的。让抽象的概念得以设计。比如当一种面向对象设计遇到一种方法有多种设计的时候,能够在基类暂且不设计他,把设计的工作交给子类去完毕,但子类设计时。要么继续继承他超类的抽象概念,要么就把抽象的方法定义出来。
全栈程序员站长
2022/07/18
2540
Typecho上传附件失败最佳解决方法
2.继续下面的工作:找到usr/uploads这个文件夹,修改777权限,linux和Windows系统修改的方法不同,但网上都有很多介绍:Windows下网站目录777可读写权限设置方法 然后重启服务器,上传附件成功。
白衣少年
2022/12/26
1.3K0
Typecho上传附件失败最佳解决方法
爬虫课堂(十四)|URL的去重方法
所谓的URL去重,就是爬虫将重复抓取的URL去除,避免多次抓取同一网页。爬虫一般会将待抓取的URL放在一个队列中,从抓取后的网页中提取到新的URL,在他们被放入队列之前,首先要确定这些新的URL没有被
黄小怪
2018/05/21
2.1K0
梁老师小课堂|谈谈模板方法模式
众多设计模式中,我觉得模板方法模式是很好理解,也很值得深入研究的技巧。定义如下,在一个包含多个步骤的业务框架中,大部分步骤是固定不变,并且适用于多种业务场景,可变的步骤则留给子类独立实现,从而分离了稳定和变化。
公众号_松华说
2020/11/17
3900
梁老师小课堂|谈谈模板方法模式
远程字体修改方法
注释: 其中font-family: ‘xxx’; 中的 xxx 字体名称(可随意命名,需要与使用时的名字保持一直)
小狐狸说事
2022/11/17
9990
JbuilderX的修改方法
打开JBuilderX/bin/jbuilder.config文件,在 #TunethisVMtoprovideenoughheadroomtoworkonlarge #applications vmparam-Xms32m vmparam-Xmx256m 后面追加一行 vmparam-Dprimetime.editor.useVariableWidthFont=true 此方法方法,在不同的系统和机器上表现的结果可能会不尽相同,大家自己研究吧。 可以把%system%/document.andSettings/you_user 目录下的/.primetimeX和/.jbuilderX目录删掉,然后再启动JBuilderX试试,一般就正常了。这时,可以看到“Tools”—“Perferences”中“Edit”—“Display”的“Fontfamily”选项为“DialogInput”。无论中文显示还光标位置应该都没有问题了,而且即使系统格掉重装,也不会有影响,不需要再重新设置。
逍遥剑客
2019/02/20
4370
JbuilderX的修改方法
打开JBuilderX/bin/jbuilder.config文件,在 #TunethisVMtoprovideenoughheadroomtoworkonlarge #applications vmparam-Xms32m vmparam-Xmx256m 后面追加一行 vmparam-Dprimetime.editor.useVariableWidthFont=true 此方法方法,在不同的系统和机器上表现的结果可能会不尽相同,大家自己研究吧。 可以把%system%/document.andSettin
逍遥剑客
2018/05/21
4820
go上传附件
package main import ( "fmt" "html/template" "io" "log" "net/http" "os" ) //上传方法 func upload(w http.ResponseWriter, r *http.Request) { //这里是get请求 if r.Method == "GET" { t, _ := template.ParseFiles("upload.html") t.Execute(w, nil) } else if r.Method == "POST" { // 服务端调用r.ParseMultipartForm,把上传的文件存储在内存和临时文件中 32 << 20 是一个很大的值:33554432 r.ParseMultipartForm(32 << 20) //这里获取表单的uploadfile file, handler, err := r.FormFile("uploadfile") if err != nil { fmt.Println(err) return } defer file.Close() //这里打开文件buffer f, err := os.OpenFile("./upload/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println(err) return } defer f.Close() //把文件cp到指定目录下。 io.Copy(f, file) fmt.Fprintf(w, "%v", handler.Header) fmt.Fprintf(w, "上传成功") } else { fmt.Println("error") } } func main() { http.HandleFunc("/upload", upload) err := http.ListenAndServe(":8081", nil) if err != nil { log.Fatal("ListenAndServe:", err) } } ------------------------------------------------------------ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>go 上传test</title> </head> <body> <form method="POST" action="/upload" enctype="multipart/form-data" > <input type="file" name="uploadfile" /> <input type="submit" value="上传"> </form> </body> </html>
公众号-利志分享
2022/04/25
1.2K0
小课堂|计算文件Checksum的几种方法
比如,我们到Apache网站上去下载用于操作Excel的依赖包 - Apache POI,就可以看到checksum:SHA-256, SHA-512,如下图所示:
孟君
2021/11/23
1.4K0
小课堂|计算文件Checksum的几种方法
emlog缩略图不同实现方法:正文-附件-随机图片
实现emlog列表也缩略图按先调用正文第一张图片,没有则调用附件图片,如果前两者都没有则调用随机图片代码
用户8099761
2023/05/10
2380
Linux修改主机名修改hostname的方法
Linux主机名即hostname,如何修改?可以临时修改主机名,但是Linux服务器重启后,主机名就失效了。还有一种方式可以永久修改主机名,Linux重启与否依然有效。两种方法都来说一说:
用户1685462
2021/08/27
27.1K1
Ubuntu修改主机名修改hostname的方法
Ubuntu主机名即hostname,如何修改?可以临时修改主机名,但是Linux服务器重启后,主机名就失效了。还有一种方式可以永久修改主机名,Linux重启与否依然有效。两种方法都来说一说:
用户8965210
2021/08/31
7.9K1
Nodejs课堂笔记—第一课:修改Webstorm的默认主题
    最近小半年一直在忙于研究Docker源码,也在写相关的分析文章。但受限于某些条件不能发布到网上,甚为郁闷。而最近几天,接到新的开发任务,需要使用nodejs。之前一直听说过nodejs,但从来没有真正使用过。     因此,在博客中就记录下学习过程,权当课堂笔记了。 OK,第一节课开始了。 正所谓:工欲善其事,必先利其器。因此在google上面搜索一番,发现nodejs开发人员都比较推崇Web-storm这个IDE。并且说这款IDE是"js 开发神器"。站在巨人们的肩膀上,可以少走不少弯路。因此我也
随机来个数
2018/04/16
7790
SAP BOM批量修改方法
BOM批量更改操作步骤分为:选择参考对象-定义选择标准-选择更改类型-定义更改数据-执行更改,查看日志。
用户5495712
2019/05/29
7.9K0
点击加载更多

相似问题

谷歌课堂API -用户ID可以修改吗?

130

谷歌课堂-入门

11

谷歌课堂API

22

谷歌课堂表单

11

谷歌课堂网站整合链接

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文