2013-04-01 128 views
-3

我拥有的是一个c程序和一个shell脚本。 c程序实现inotify库。该程序监视目录并将新生成的文件写入目录到一个文件。然后,shell脚本将这些文件rsyncs到一个远程目录,将c程序生成的文件作为输入。我怎样才能在c程序和shell脚本之间进行sysnchronise ...?shellscript和c程序之间的同步

+0

欢迎来到Stack Overflow。请阅读[常见问题]。你写了C程序吗?或者你有源码吗?如果你需要,你可以做出修改吗? C程序如何写入其日志文件?你能告诉它要写入哪个文件吗?当你写了100个文件(1个文件,10个文件,...)时,你可以在已知的文件名之间进行切换吗?它有多忙?每秒会有几十或几百个文件,还是每五分钟一个?这些因素会影响你最擅长的事情。 –

+0

亲爱的乔纳森感谢您的及时回复。 c程序不是由我编写的,但它的源代码是可用的,因此完全可以修改。所以你所有的查询都是可能的。目前我正在尝试监视运行SAP的办公室服务器中的oracle数据库的归档日志目录。日志生成不一样。 – varun

+0

为什么不把它全写在C中,或全部写在'bash'中?你可以从C中调用'rsync',或者从'bash'调用'inotifywatch'(和其他)。 – cdarke

回答

1

比方说,C程序将目录中新生成的文件写入名为'LIST.txt'的文件。

mv LIST.txt LIST_TO_SYNC.txt && :> LIST.txt 
rsync --include-from=LIST_TO_SYNC.txt #add your real parameters 
mv LIST_TO_SYNC.txt LIST.txt.`date +%Y%m%d_%H%M%S` 
+0

如果日志观察程序以附加模式打开'LIST.txt',或者每次需要添加文件时打开'LIST.txt',那么这是一个很好的工作机会。如果日志观察者不以附加模式打开文件,那么它将在文件的前1个KiB中写入前20个条目。然后你显示的脚本将复制文件和rsync OK。日志观察者下次写入时,它将以偏移量1 KiB写入。下次脚本运行时,它将看到一个空字节为1 KiB的文件,后面是新名称。冲洗并重复。如果'rsync'不喜欢带有空值的文件,则会出现问题。 –

0

将'评论中的评论'转换为答案。评论现在被删除。

您确定Oracle(SAP)不提供允许您在完成日志文件存档时使用的机制吗?如果是这样,那么使用它们可能是明智的;他们可能会更可靠。

如果您正在处理来自DBMS的日志文件,那么如果日志文件无法一次保持数分钟,那么很可能会认为数据库管理系统配置错误,因此到达率很可能会降低每隔几分钟就会有一个相对稳定的“一个文件”,而不是每秒钟狂热的“数百个文件”。这很好。因此,您应该考虑修改C程序是否合理(我将其称为logwatcher),以便当它检测到新文件到达时,它会运行一个可配置脚本,该脚本传递的是新到文件。这个脚本可以做任何需要的同步/复制,相信没有竞争条件可以处理。这可能是最简单的:

logwatcher -d "$TARGETDIR" -p '*.log' -e "$BACKUPSCRIPT" 

-d "$TARGETDIR"指定要监视的目录; -p '*.log'指定日志文件名称的模式; -e "$BACKUPSCRIPT"是要运行的脚本。

当检测到新文件时,logwatcher以相关(绝对)文件名运行$BACKUPSCRIPT。这应该很容易管理,并且足够灵活以满足大多数需求。该$BACKUPSCRIPT可以rsync该文件到另一台机器或其他任何你需要它做的事情。如果需要,您可以提供环境变量和配置文件。

相关问题