2008-10-16 104 views
0

的情况如下:处理文本文件

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

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

提供的一个建议是在FTP服务器上运行cronjob,但是有一个服务条款限制只允许30分钟的时间间隔cronjob,因为它是共享托管的。鉴于上传工作站的数量和上传时间间隔为10分钟,看起来cronjob的30分钟呼叫限制可能是一个问题。

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

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

回答

4

大多数现代Linux将支持inotify,让你的过程知道指令的内容何时改变,所以你甚至不需要轮询。

编辑:对于下面的马克·贝克的评论:

“不过要小心,因为你会尽快创建文件通知,而不是当它关闭所以你需要一些确保你不会拿起部分文件的方式。“

这会发生在您在目录级别设置的inotify监视器上 - 确保您不会接收部分文件的方法是在新文件上设置更多inotify监视并查找IN_CLOSE事件以便您知道该文件已完全写入。

一旦你的过程看到了这个,你可以删除这个新文件的inotify监视,并在闲暇时进行处理。

4

你可能会考虑一个持久的守护进程,保持投票的目标目录:

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

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

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

1

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

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

你可以从perl中使用inotify与Linux :: Inotify,或者从python与pyinotify一起使用。

但要小心,因为一旦文件被创建,您就会收到通知,而不是在它关闭时收到通知。所以你需要一些方法来确保你不会拿起部分文件。

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

1

如果你想保留现有的FTP服务器设置,那么我建议使用类似inotify或daemonized的过程来观察上传目录。如果您可以移动到不同的FTP服务器,那么您可以看看pyftpdlib这是一个Python FTP服务器库。

我一直是pyftpdlib开发小组的一部分,而一个更常见的请求是一种方式来处理文件,一旦他们完成上传。因此,我们创建了一个on_file_received()回调方法,该方法在完成上传时触发(请参阅我们的问题跟踪器上的issue #79以了解详细信息)。

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