【发布时间】:2015-07-08 13:06:28
【问题描述】:
我目前使用 tail -f 来监控日志文件:这样我得到一个自动刷新控制台来监控 Web 服务器。
现在,所说的网络服务器已移至另一台主机,而我对此没有 shell 权限。 不过我有一个 .txt 网络路径,最后是一个不断更新的日志文件。
所以,我想做一些类似于 tail -f 的操作,但是在那个 url 上。 这可能吗?最后“在linux中一切都是文件”所以..
【问题讨论】:
我目前使用 tail -f 来监控日志文件:这样我得到一个自动刷新控制台来监控 Web 服务器。
现在,所说的网络服务器已移至另一台主机,而我对此没有 shell 权限。 不过我有一个 .txt 网络路径,最后是一个不断更新的日志文件。
所以,我想做一些类似于 tail -f 的操作,但是在那个 url 上。 这可能吗?最后“在linux中一切都是文件”所以..
【问题讨论】:
您可以在 watch 和 wget 的帮助下进行自动刷新。
它不会显示历史记录,如tail -f,而是更新屏幕,如top。
命令示例,在屏幕上显示 file.txt 的内容,并每五秒更新一次输出:
watch -n 5 wget -qO- http://fake.link/file.txt
另外,您可以输出最后 n 行,而不是整个文件:
watch -n 5 "wget -qO- http://fake.link/file.txt | tail"
如果您仍然需要“tail -f”(保留历史记录)之类的行为,我认为您需要编写一个脚本,该脚本将在每个时间段下载日志文件,将其与之前下载的版本进行比较,然后打印新的线。应该很容易。
【讨论】:
我编写了一个简单的 bash 脚本,每 2 秒获取一次 URL 内容并与本地文件 output.txt 进行比较,然后将差异附加到同一个文件中
我想在我的 Jenkins 管道中流式传输 AWS 放大日志
while true; do comm -13 --output-delimiter="" <(cat output.txt) <(curl -s "$URL") >> output.txt; sleep 2; done
别忘了先创建空文件output.txt文件
: > output.txt
查看直播:
tail -f output.txt
原评论:https://stackoverflow.com/a/62347827/2073339
更新:
我在这里使用 wget 找到了更好的解决方案:
while true; do wget -ca -o /dev/null -O output.txt "$URL"; sleep 2; done
【讨论】:
我制作了这个小函数并将其添加到我的 shell 的 .*rc 中。这使用了wget -c,所以它不会重新下载整个页面:
# Poll logs continuously over HTTP
logpoll() {
FILE=$(mktemp)
echo "———————— LOGPOLLING TO $FILE ————————"
tail -f $FILE &
tail_pid=$!
bg %1
stop=0
trap "stop=1" SIGINT SIGTERM
while [ $stop -ne 1 ]; do wget -co /dev/null -O $FILE "$1"; sleep 2; done
echo "——————————— LOGPOLL DONE ————————————"
kill $tail_pid
rm $FILE
trap - SIGINT SIGTERM
}
mktemp 创建一个临时日志文件并将其路径保存到$FILE
tail -f在后台连续输出日志文件stop为1而不是退出函数stop位被设置,即直到用户按下ctrl+c
wget 每两秒循环一次给定 URL:
-c - “继续获取部分下载的文件”,以便 wget 继续而不是截断文件并再次下载-o /dev/null - wget 的日志消息将被扔进 void-O $FILE - 将内容输出到我们创建的临时日志文件中tail -f,删除临时日志文件,取消设置信号处理程序。【讨论】:
建议的解决方案会定期下载完整文件。
为了避免我创建了一个包并在 NPM 中发布,它执行 HEAD 请求(获取文件的大小)并且只请求最后一个字节。
检查一下,如果您需要任何帮助,请告诉我。
【讨论】: