0

情况如下:

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

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

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

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

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

4

4 回答 4

4

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

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

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

要考虑的另一种方法是通过 HTTP POST 提交文件,然后通过 CGI 处理它们。这样,您就可以保证在提交时已对它们进行了适当的处理。

于 2008-10-16T14:31:05.867 回答
4

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

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

“不过要小心,因为您会在文件创建后立即收到通知,而不是在文件关闭时通知您。所以您需要一些方法来确保您不会拾取部分文件。”

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

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

于 2008-10-16T15:17:33.497 回答
1

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

您将需要某种长时间运行的守护程序。最简单的方法就是定期进行投票,这可能就是我要做的。Inotify 是一个更好的选择,因此您可以在创建文件后立即收到通知。

您可以将 perl 中的 inotify 与 Linux::Inotify 一起使用,或者将 python 中的 inotify 与 pinotify 一起使用。

不过要小心,因为您会在文件创建后立即收到通知,而不是在文件关闭时通知您。所以你需要一些方法来确保你不会拾取部分文件。

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

于 2008-10-16T16:56:45.167 回答
1

如果您希望保留现有的 FTP 服务器设置,那么我建议您使用诸如 inotify 或守护进程之类的东西来观看上传目录。如果您可以迁移到不同的 FTP 服务器,您可以查看pyftpdlib,它是一个 Python FTP 服务器库。

我一直是 pyftpdlib 开发团队的一员,其中一个更常见的请求是在文件完成上传后“处理”文件。因此,我们创建了一个on_file_received()在上传完成时触发的回调方法(有关详细信息,请参阅我们的问题跟踪器上的问题 #79 )。

如果您熟悉 Python,那么将 pyftpdlib 作为您的 FTP 服务器并从回调方法运行您的处理代码可能会很好。注意 pyftpdlib 是异步的,不是多线程的,所以你的回调方法不能阻塞。如果您需要运行长时间运行的任务,我建议使用单独的 Python 进程或线程来进行实际处理工作。

于 2009-04-03T01:01:51.113 回答