【发布时间】:2012-05-02 16:43:44
【问题描述】:
我正在编写一个脚本来读取输入文件,其中包含约 1000 行主机信息。脚本 ssh 到每个主机,cd 到远程主机日志目录并 cat latest 每日日志文件。然后我将 cat 日志文件重定向到本地,做一些模式匹配和统计。
我的程序的简化结构是一个while循环,如下所示:
while read host
do
ssh -n name@$host "cd TO LOG DIR AND cat THE LATEST LOGFILE" | matchPattern
done << EOA
$(awk -F, '{print &7}' $FILEIN)
EOA
其中 matchPattern 是一个匹配模式并进行统计的函数。
现在我有 2 个问题:
1) 如何远程查找最新日志文件? latest 日志文件名匹配 xxxx2012-05-02.log 并且是最新创建的,是否可以远程执行 ls 并找到匹配 xxxx2012-05-02.log 文件名的文件?(I可以在本地执行此操作,但在将其附加到 ssh 命令时会卡住)我可以想出的另一种方法是
cat 'ls -t | head -1' or
cat $(ls -t | head -1)
但是,如果我将此附加到 ssh,它将列出我本地最新创建的文件名,我们可以将其设置为远程变量,以便 cat 找到正确的文件吗?
2) 由于有近 1000 个主机,我想知道我是否可以并行执行此操作(例如一次执行 20 个 ssh,并在前 20 个完成后执行下一个 20),将 & 附加到每个 ssh 似乎不是完成它就足够了。
任何想法将不胜感激!
跟进: 大家好,我终于找到了一个糟糕的方法来解决第一个问题:
ssh -n name@$host "cd $logDir; cat *$logName" | matchPattern
其中 $logName 是“今天的 date.log”(2012-05-02.log)。问题是我只能在双引号内使用 local 变量。由于我的日志文件以 2012-05-02.log 结尾,并且没有其他文件以这个后缀结尾,所以我只是在远程机器上盲目地执行 cat *2012-05-02.log,它会为我找到所需的文件。
【问题讨论】:
-
某些版本的 xargs 可能会有所帮助。使用
man xargs并将您的可用选项与您在 S.O. 上找到的建议进行比较。搜索[bash] xargs。祝你好运。 -
我在 Python 中使用
Threading 和 Paramako 做了几乎完全相同的事情。我可以在 4 分钟内挖出大约 2000 台机器。 (总而言之,我认为使用更好的工具箱可能更容易完成这项任务,我不认为 shell 是合适的工具) -
@tMC 是的,我可能也在使用 python...但是问题的阈值不是网络连接,它正在解析可能超过 2G 的大日志文件,无论如何我可能会考虑 python作为赌注:)
-
如果解析文件非常耗时,请在远程节点上进行。如果每个节点处理自己的文件,并行化会更快更容易