1

私のbashスクリプトを簡単に並列化できるようにするために、この機能を取得しようとしています。アイデアは単純です。各コマンドを順番に実行する代わりに、実行したいコマンドをこの関数にパイプします。私のためにバックグラウンドでジョブを実行し、ロジスティクスを処理します....しかし、うまくいきません。set -x by where stuff's execute を追加しましたが、実行したいものの周りに奇妙な引用符が表示されているようです...どうすればよいですか?

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

出力の引用符はset -x問題ではなく、せいぜい問題の別の結果です。主な問題は${line}、 と同じではないことですeval ${line}

変数が展開されると、結果の単語はシェルの予約構造として扱われません。そして、これは予想されることです。

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

私がこれを正しく理解していれば、echo コマンドで一重引用符を使用したくないでしょう。一重引用符はリテラル文字列であり、bash 変数 $H を解釈しません。

于 2012-05-09T04:02:51.350 に答える
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 に答える