我有下面的设置。
在远程机器中,我有一个连续运行的进程,它订阅某些数据并将其写入stdout (让我们将该进程称为订阅者)。我从一个.sh脚本调用订阅者,该脚本将stdout重定向到包含名称上日期的文件,让我们调用那个日志文件。总体来说,我想要实现的是将这些日志文件分解成不同的日期,这样我就可以将它们从远程机器带到本地。
对于我所熟悉的解决方案来说,有一件事情是特殊的,它使我无法工作:日志文件包含快照数据和一个增量流。这意味着我不能只对日志文件进行日志旋转,因为下一个日志文件的开头将丢失快照。我现在处理这个问题的方式是手动停止订阅服务器,并从.sh脚本重新启动它。.sh脚本将把标准输出重定向到下一个日期的日志文件。在重新启动之间缺少几秒钟的数据对我来说没有问题。有问题的是有一个日志文件丢失了它的初始快照。
所以我的问题是:自动化这个手动过程的正确方法是什么?
我有一个我不喜欢的部分解决方案。
.log,而是在这个答案的启发下将其命名为.log.part。.log.part日志文件被重命名为.log,这意味着该日志文件可以移出。.log文件。即使我找到了如何完成最后一步,我也不喜欢这个解决方案,因为我从未见过像这样建立在cronjobs之上的强大管道。
所以,如果有人知道一个强有力的方法来做到这一点,那是什么呢?如果没有,如何保证在订阅服务器死亡时将.log.part文件重命名为.log?
谢谢
发布于 2020-03-23 20:41:05
您现在的cron脚本可能如下所示:
setsid subscriber > subscriber.date.log &您希望有一个shell,等待订阅服务器退出,然后重命名它的输出。像这样的事情可以做到:
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不会完成。
https://serverfault.com/questions/1007797
复制相似问题