1

我正在尝试使用此功能来轻松并行化我的 bash 脚本工作。这个想法很简单;我不是按顺序运行每个命令,而是将我想运行的命令传递给这个函数,它在读取行时执行;为我运行 bg 中的工作并照顾后勤....虽然它不起作用。我在执行东西的地方添加了 set -x ,看起来我在想要执行的东西周围得到了奇怪的引号......我该怎么办?

runParallel () {
    while read line
    do
        while [ "`jobs | wc -l`" -eq 8 ]
        do
            sleep 2
        done

        {
            set -x
            ${line}
            set +x
        } &
    done

    while [ "`jobs | wc -l`" -gt 0 ] 
    do
        sleep 1
        jobs >/dev/null 2>/dev/null
        echo sleeping
    done
}

for H in `ypcat hosts | grep fmez | grep -v mgmt | cut -d\  -f2 | sort -u`
do
    echo 'ping -q -c3 $H 2>/dev/null 1>/dev/null && echo $H - UP || echo $H - DOWN'
done | runParallel

当我运行它时,我得到如下输出:

> ./myscript.sh
+ ping -q -c3 '$H' '2>/dev/null' '1>/dev/null' '&&' echo '$H' - UP '||' echo '$H' - DOWN
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
            [-M mtu discovery hint] [-S sndbuf]
            [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
+ set +x
sleeping
> 
4

4 回答 4

1

如果我理解正确,您可能不希望在 echo 命令中使用单引号。单引号是文字字符串,不会解释您的 bash 变量 $H。

于 2012-05-09T04:02:51.350 回答
1

输出中的引号set -x不是问题,最多是问题的另一个结果。主要问题是${line}不一样eval ${line}

扩展变量时,生成的单词不会被视为 shell 保留结构。这是意料之中的,这意味着例如。

A="some text containing > ; && and other weird stuff"
echo $A

不会对无效语法大喊大叫,而是打印变量值。

但是在您的函数中,这意味着 中的所有单词${line},包括2>/dev/null等,都作为参数传递给 ping,其set -x输出很好地显示,因此 ping 抱怨。

如果您想从带有重定向和条件的变量执行复杂的命令行,则必须使用eval.

于 2012-05-09T08:17:30.597 回答
1

像许多 GNU Parallel 用户一样,您似乎已经编写了自己的并行器。

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

cat hosts | parallel -j8 'ping -q -c3 {} 2>/dev/null 1>/dev/null && echo {} - UP || echo {} - DOWN'

您可以通过以下方式安装 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-09T21:26:39.863 回答
0

将您的命令放入数组中。

于 2012-05-09T04:03:51.163 回答