通过批处理文件自动化 cygwin
Posted
技术标签:
【中文标题】通过批处理文件自动化 cygwin【英文标题】:Automate cygwin via batch file 【发布时间】:2010-09-28 08:33:49 【问题描述】:长话短说...我们有多个服务器,我们每晚都在运行 perflog 监控。我的工作是将这些日志转换为 .csv 格式并将它们发送到我的电子邮件中。
这部分已经通过前雇员编写的 .sh 脚本自动化。
我想要自动化的是在 perfmon 日志记录后运行批处理作业以查看特定文件夹并找到最新的 .blg 文件并在其上运行 sh 脚本(该脚本称为上传),这样我就不会必须登录到每个服务器并手动进行。
例如
上传 myInitials cd /cygdrive/someLocation/logs/$latestFile$.blg
myInitials 和位置可以硬编码...我只是不知道如何在文件夹中找到最新的文件并通过批处理文件将其全部自动化。
任何指针都会非常有帮助!
@杰里米:
对不起,我可能应该在我的问题中提到服务器运行 2003 年和 2008 年。
我不认为绝对有必要在文件夹上注册更改通知 - 如果日志从中午运行到早上 7 点,脚本将立即运行(您可以将脚本设置为在perfmon 日志已在日志属性中完成),因此该日志几乎肯定是文件夹中的最新文件。
就像我说的,我已经有一个 .sh 文件可以转换为 csv 并发送到我的电子邮件,我只需要将它合并到一个批处理文件中,这样我就不必去每个服务器和打开cygwin并输入upload xx /cygdrive/location/logs/xyz.blg,我可以让它在日志完成后自动运行,而无需我进入RDC。
感谢您的意见!
【问题讨论】:
什么程序产生日志,你怎么知道日志什么时候结束?也许您可以将脚本连接到该程序的末尾,以便自动调用脚本,而不必查找最近的文件? 为什么需要.bat 脚本,为什么不能只使用合适的shell 脚本? 【参考方案1】:如果你有一个 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 中输入时,它没有提供任何输出(也没有错误) 可能你的当前目录没有文件!! 我愿意!我在一个充满 blg 和 csv 文件的目录中,我运行了 ls -1tr | tail -1 但它不显示任何内容。 @emtunc:Vardhan 建议的命令应该可以工作。也许再试一次。如果 .blg 文件名以.
(点)开头,您可能必须使用 ls -a1tr | grep '[.]blg$' | tail -1
。
好的,当我在另一台服务器上尝试它时它工作了 - 奇怪。感谢您的提示!【参考方案3】:
首先,我不知道它是否能满足您的要求,但 Vista+ 中的 Windows 任务计划程序 2非常强大,甚至可以根据日志条目触发事件。但是,该日志条目的提取和解析可能需要一些脚本,并且可能存在并发问题,即使该日志条目确实指示了最后使用的进程。可能这些都没有帮助,但只是把它扔在那里。
以编程方式,这很简单,因为您可以在文件夹上注册更改通知。发生更改时,您会找到最新的文件。然后启动批处理文件以启动您的 shell 脚本,或者任何您想要的序列。
我认为 cygwin 甚至可以通过脚本支持更改通知事件,尽管我不确定。我相信对此有 linux 扩展,但我可能错了。
如果是我,我会写一个小 C++ 应用程序来做任何我想做的事情。但对你来说,上述任何一个(或更可能没有)可能会有所帮助;o。
【讨论】:
感谢 Jeremy 的建议 - 我更新了我的原始帖子! (太长无法发表评论)以上是关于通过批处理文件自动化 cygwin的主要内容,如果未能解决你的问题,请参考以下文章