通过批处理文件自动化Cygwin

4
简而言之,我们有多台服务器,每晚都会运行perflog监控。我的工作是将这些日志转换为.csv格式并发送到我的电子邮件。这部分已经通过一个前员工编写的.sh脚本自动化了。
我想要自动化的是,在perfmon记录后运行批处理作业,查找特定文件夹中的最新.blg文件,并在其上运行sh脚本(脚本名为upload),以便我不必登录到每个服务器并手动执行它。
例如:upload myInitials cd /cygdrive/someLocation/logs/$latestFile$.blg
myInitials和位置可以硬编码...我只是不知道如何在文件夹中找到最新的文件并通过批处理文件自动化所有操作。任何提示都将非常有帮助!
抱歉,我可能应该在问题中提到服务器正在运行2003和2008。我认为没有必要在文件夹上注册更改通知-如果日志从中午运行到早上7点,脚本将立即运行(您可以在日志属性中设置脚本在perfmon日志完成后运行),因此日志几乎肯定是文件夹中的最新文件。
就像我说的,我已经有一个.sh文件来转换为csv并发送到我的电子邮件,我只需要将其合并到批处理文件中,以便我无需登录到服务器并打开cygwin并键入upload xx /cygdrive/location/logs/xyz.blg,我可以自动化运行日志完成后的操作,而无需远程桌面连接。感谢您的帮助!

哪个程序生成了日志,你如何知道日志何时完成?也许你可以将脚本连接到该程序的末尾,这样脚本就会自动调用,而不必寻找最近的文件? - Vladimir Alexiev
为什么你需要一个 .bat 脚本,不能使用一个适当的 shell 脚本呢? - SamB
3个回答

8

如果你有一个Shell脚本,并需要从Windows批处理文件中调用该Shell脚本,则以下内容可以解决问题。这里假设Cygwin已经安装在C:盘。

start_cyg.bat的内容如下:

@echo off
set PATH=%PATH%:"C:\Cygwin\bin"

rem bash --login -i

bash "/cygdrive/d/cyg.sh"

cyg.sh的内容

#!/bin/bash

TAIL=`ls -lrt | tail -1`
echo "TAIL:$TAIL"

如果你在Windows命令提示符下调用 start_cyg.bat,你可以在控制台中获得 cyg.sh 的输出。

2

如果要获取目录中最新的文件,ls -1tr | tail -1 应该可以解决。


当我在Cygwin中输入这个命令时,它没有提供任何输出(也没有错误)。 - emtunc
当前目录中可能没有文件!! - vrdhn
我做了!我在一个充满blg和csv文件的目录中,然后我执行了ls -1tr | tail -1,但它没有显示任何内容。 - emtunc
@emtunc:Vardhan建议的命令应该可以工作。 也许再试一次。 如果.blg文件名以“.”(点)开头,则可能必须使用ls -a1tr | grep '[.]blg$' | tail -1 - Dan Moulding
好的,在另一台服务器上尝试时它起作用了,很奇怪。谢谢你的提示! - emtunc

1

首先,我不知道它是否符合您的要求,但是Vista+中的Windows任务计划程序2非常强大,甚至可以基于日志条目触发事件。然而,提取和解析该日志条目可能需要一些脚本编写,并且可能存在并发问题,即使该日志条目确实指示了上次使用的进程。很可能这些都没有帮助,但只是随便提出来。

从程序角度来看,这将是简单的,因为您可以在文件夹上注册更改通知。当更改发生时,您可以找到最新的文件。然后启动批处理文件以启动您的shell脚本或任何所需的序列。

我认为cygwin甚至可以通过脚本支持更改通知事件,尽管我不确定。我相信Linux有此类扩展,但我可能错了。

如果是我,我会编写一个小型的C++应用程序来完成我想要的任何操作...但对于您来说,也许以上任何一种(或更可能是没有)都没有帮助; o。


感谢您的建议Jeremy - 我已经更新了我的原始帖子!(太长了,无法作为评论发布) - emtunc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接