情况如下:

一系列远程工作站收集现场数据,并通过ftp将收集到的现场数据FTP到服务器上。数据以 CSV 文件形式发送,该文件存储在 FTP 服务器中每个工作站的唯一目录中。

每个工作站每 10 分钟发送一次新的更新,导致以前的数据被覆盖。我们希望以某种方式自动连接或存储这些数据。工作站的处理能力有限且无法扩展,因为它是嵌入式系统。

提出的一项建议是在 FTP 服务器中运行 cronjob,但是服务条款限制仅允许 30 分钟间隔内的 cronjobs,因为它是共享托管。考虑到上传的工作站数量以及上传之间的 10 分钟间隔,看起来 cronjob 的调用之间的 30 分钟限制可能是一个问题。

还有其他可以建议的方法吗?可用的服务器端脚本语言有 perl、php 和 python。

升级到专用服务器可能是必要的,但我仍然希望获得有关如何以最优雅的方式解决此问题的意见。

有帮助吗?

解决方案

大多数现代 Linux 将支持 inotify,以便让您的进程知道目录内容何时发生更改,因此您甚至不需要轮询。

编辑:关于马克·贝克的以下评论:

“但要小心,因为文件创建后您就会收到通知,而不是文件关闭时。因此,您需要某种方法来确保您不会拾取部分文件。”

您在目录级别设置的 inotify 监视会发生这种情况 - 确保您不会拾取部分文件的方法是在新文件上设置进一步的 inotify 监视并查找 IN_CLOSE 事件,以便您知道文件已完全写入。

一旦您的进程看到了这一点,您就可以删除这个新文件上的 inotify 监视,并在闲暇时处理它。

其他提示

您可能会考虑一个持久守护进程来持续轮询目标目录:

grab_lockfile() or exit();
while (1) {
    if (new_files()) {
        process_new_files();
    }
    sleep(60);
}

然后你的cron作业可以尝试每30分钟启动一次守护进程。如果守护进程无法获取锁定文件,它就会死掉,所以不用担心多个守护进程在运行。

另一种考虑的方法是通过HTTP POST提交文件,然后通过CGI处理它们。这样,您就可以保证在提交时已经妥善处理了这些内容。

30分钟的限制确实非常愚蠢。在linux中启动进程并不是一项昂贵的操作,所以如果您所做的只是检查新文件,那么没有理由不经常这样做。我们有每分钟运行的cron作业,它们对性能没有任何明显的影响。但是,我意识到这不是你的规则,如果你要坚持使用那个托管服务提供商,你就没有选择。

你需要一个长跑的守护进程。简单的方法就是定期轮询,这可能就是我要做的事情。 Inotify,因此您可以在创建文件后立即收到通知,这是一个更好的选择。

您可以在Linux :: Inotify中使用perl的inotify,或者使用pyinotify从python使用inotify。

但请注意,因为您会在创建文件后立即通知您,而不是在文件关闭时通知您。所以你需要一些方法来确保你不要拿起部分文件。

通过轮询,你不太可能看到部分文件,但它最终会发生,并且当它确实发生时将是一个令人讨厌的难以重现的错误,所以现在更好地处理问题。

如果您希望继续使用现有的FTP服务器设置,那么我建议您使用inotify或daemonized进程等内容来观看上传目录。如果您可以移动到其他FTP服务器,可以查看 pyftpdlib 这是一个Python FTP服务器库。

我一直是pyftpdlib开发团队的一员,而且一个更常见的请求是“处理”方法。文件上传完成后。因此我们创建了一个 on_file_received()回调方法,该方法在完成上传后触发(参见问题#79 以获取详细信息)。

如果您对Python感到满意,那么将pyftpdlib作为您的FTP服务器运行并从回调方法运行处理代码可能会很好。请注意,pyftpdlib是异步的而不是多线程的,因此您的回调方法无法阻止。如果您需要运行长时间运行的任务,我建议使用单独的Python进程或线程来进行实际的处理工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top