首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保证日志文件不再写入日志文件后重命名日志文件

保证日志文件不再写入日志文件后重命名日志文件
EN

Server Fault用户
提问于 2020-03-21 12:49:17
回答 1查看 33关注 0票数 0

我有下面的设置。

在远程机器中,我有一个连续运行的进程,它订阅某些数据并将其写入stdout (让我们将该进程称为订阅者)。我从一个.sh脚本调用订阅者,该脚本将stdout重定向到包含名称上日期的文件,让我们调用那个日志文件。总体来说,我想要实现的是将这些日志文件分解成不同的日期,这样我就可以将它们从远程机器带到本地。

对于我所熟悉的解决方案来说,有一件事情是特殊的,它使我无法工作:日志文件包含快照数据和一个增量流。这意味着我不能只对日志文件进行日志旋转,因为下一个日志文件的开头将丢失快照。我现在处理这个问题的方式是手动停止订阅服务器,并从.sh脚本重新启动它。.sh脚本将把标准输出重定向到下一个日期的日志文件。在重新启动之间缺少几秒钟的数据对我来说没有问题。有问题的是有一个日志文件丢失了它的初始快照。

所以我的问题是:自动化这个手动过程的正确方法是什么?

我有一个我不喜欢的部分解决方案。

  • 每天在特定时间从crontab调用一个新的.sh脚本
  • 然后,此脚本按名称(即订阅服务器)终止所有进程。
  • 使用指向新日志文件的stdout重新启动订阅服务器,但不将其命名为.log,而是在这个答案的启发下将其命名为.log.part
  • 然后,我必须找出如何保证当订阅者死后,.log.part日志文件被重命名为.log,这意味着该日志文件可以移出。
  • 然后从本地机器上运行rsync以获取所有.log文件。

即使我找到了如何完成最后一步,我也不喜欢这个解决方案,因为我从未见过像这样建立在cronjobs之上的强大管道。

所以,如果有人知道一个强有力的方法来做到这一点,那是什么呢?如果没有,如何保证在订阅服务器死亡时将.log.part文件重命名为.log

谢谢

EN

回答 1

Server Fault用户

发布于 2020-03-23 20:41:05

您现在的cron脚本可能如下所示:

代码语言:javascript
复制
setsid subscriber > subscriber.date.log &

您希望有一个shell,等待订阅服务器退出,然后重命名它的输出。像这样的事情可以做到:

代码语言:javascript
复制
log_date_str=`date ...`

watcher()
{
        subscriber > subscriber.${log_date_str}.log.part
        mv subscriber.${log_date_str}.log.part subscriber.${log_date_str}.log
}

killall subscriber
setsid watcher &

由于观察者是在后台启动的,所以它是在单独的shell进程中启动的。父shell启动shell函数,然后退出。在它自己的shell进程中,watch函数启动订阅服务器,然后等待它完成。一旦完成,它就会预先形成重命名。

有几个问题:

如果订阅服务器像守护进程一样分叉进入后台,并且没有被shell脚本备份,那么您需要弄清楚如何阻止它这样做(-d是常见的)。这是不太可能的问题,因为输出到stdout和叉本身是很奇怪的。

其次,如果您的shell中没有内置setsid,则必须将watch拆分到它自己的shell脚本中,并调用它而不是函数。

我建议使用pstree来查看父子关系关系。

另外,确保您没有在脚本中执行set -e (或者在观察者中关闭它),否则当订阅者出现错误退出时,mv不会完成。

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

https://serverfault.com/questions/1007797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档