2

我正在编写一个脚本来从输入文件中读取,该文件包含约 1000 行主机信息。脚本 ssh 到每个主机,cd 到远程主机日志目录并 cat最新的每日日志文件。然后我在本地重定向 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 是一个匹配模式并进行统计的函数。

现在我有两个问题:

1)如何远程查找最新的每日日志文件?最新的日志文件名匹配 xxxx2012-05-02.log 并且是最新创建的,是否可以远程执行 ls 并找到与 xxxx2012-05-02.log 文件名匹配的文件?(我可以在本地执行此操作但会卡住将其附加到 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)。问题是我只能在双引号内使用局部变量。由于我的日志文件以 2012-05-02.log 结尾,并且没有其他文件以这个后缀结尾,我只是cat *2012-05-02.log在远程机器上盲目地做一个,它会为我找到所需的文件。

4

3 回答 3

1

对于你的第二个问题,看看并行分布式外壳:

http://sourceforge.net/projects/pdsh/

于 2012-05-02T17:12:48.223 回答
1

对于你的第一个问题,

ssh -n name@$host 'cat $(ls -t /path/to/log/dir/*.log | head -n 1)'

应该管用。注意远程命令周围的单引号。

对于您的第二个问题,将所有内容包装ssh | matchPattern | analyse到它自己的函数中,然后通过

outstanding=0
while read host
do
    sshMatchPatternStuff &
    outstanding=$((outstanding + 1))
    if [ $outstanding -ge 20 ] ; then
        wait
        outstanding=$((outstanding - 1))
    fi
done << EOA
    $(awk -F, '{print &7}' $FILEIN)
EOA
while [ $outstanding -gt 0 ] ; do
    wait
    outstanding=$((outstanding - 1))
done

(我假设您正在使用bash.)

最好将这些ssh | matchPattern | analyse东西分离到自己的script中,然后使用并行变体xargs来调用它。

于 2012-05-02T17:36:20.610 回答
0

如果你安装了 GNU Parallel http://www.gnu.org/software/parallel/你可以这样做:

parallel -j0 --nonall --slf <(awk -F, '{print $7}' servers.txt) 'cd logdir; cat `ls -t | head -1` | grep pattern'

这样您就可以在远程服务器上完成匹配。如果您希望传输完整的日志文件并在本地进行匹配,只需将 grep 移到外面:

parallel -j0 --nonall --slf <(awk -F, '{print $7}' servers.txt) 'cd logdir; cat `ls -t | head -1`' | grep pattern

您可以通过以下方式安装 GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

观看 GNU Parallel 的介绍视频以了解更多信息: https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-05-27T17:17:54.453 回答