2017-12-13 44 views
2

私は次のスクリプトを並列化しようとしています。bashで並列実行forループを実行する

#!/bin/bash 
     for i in `cat /root/vms`; 
     do 
     /usr/bin/sshpass -p 'test' /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser $i -t 'echo test | sudo -S yum update -y' 
     done 
+0

:あなたは、あなたがもう少し複雑な関数を作成し、GNUパラレル転送することができている実行したい* forループは*を - あなたはワン行います並列に複数の 'for'ループを実行するには?その場合は、ループの数を指定する必要があります – RomanPerekhrest

答えて

1

このようなパラレルあなたがGNUとかなり簡潔にそれを行うことができます

/usr/bin/sshpass ... & 
+0

ここではforループが連続して実行されています。 forループを並列に実行したい。 – gosatriani

+0

これがこの変更の仕組みです。あなたのファイル/ root/vmsが20行含まれている場合、これは20のsshpass並列を開始します。 – Cyrus

+0

@gosatriani、どうやってあなたの "*連続実行*"を実現していますか?技術的には、このアプローチはバックグラウンドジョブとして各コマンドを起動します。上記のコマンドを使用すると、 – RomanPerekhrest

2

/usr/bin/sshpass ... 

を交換してください:

だから、
parallel -a /root/vms /usr/bin/sshpass -p \'test\' /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser {} -t \'echo test \| sudo -S yum update -y\' 

、あなた場合が含まれています:

vm-ubuntuLTS 
vm-centos 
vm-debian 
vm-arch 

、あなたは実際に何もせず、それがどうなるか見て--dry-runオプションを追加します。

parallel --dry-run -a /root/vms /usr/bin/sshpass -p \'test\' /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser {} -t \'echo test \| sudo -S yum update -y\' 

サンプル出力むしろ

/usr/bin/sshpass -p 'test' /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser vm-debian -t 'echo test | sudo -S yum update -y' 
/usr/bin/sshpass -p 'test' /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser vm-centos -t 'echo test | sudo -S yum update -y' 
/usr/bin/sshpass -p 'test' /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser vm-ubuntuLTS -t 'echo test | sudo -S yum update -y' 
/usr/bin/sshpass -p 'test' /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser vm-arch -t 'echo test | sudo -S yum update -y' 

あなたのすべてを繰り返すよりsshのオプションは、このよう$HOME/.ssh/configでファイルにそれらを置くことを検討:

PARALLEL_SSH="/usr/bin/sshpass -p test /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser -t" 
export PARALLEL_SSH 
parallel --slf /root/vms --nonall 'echo test | sudo -S yum update -y' 

のものの場合:

Host vm-centos 
HostName vm-centos 
User freddy 
    StrictHostKeyChecking no 

Host vm-arch 
HostName vm-arch 
    User frog 
    Port 2222 
    ServerAliveInterval 10 
+0

を並列実行していますが、いくつかの構文エラーが並行して起こります。警告:あなたは--tollefを使用しています。もし何かがWEIRD USEを使っているなら--gnu。 並列:警告:--tollefは廃止され、廃止される20140222. 並列:警告:参照:http://lists.gnu.org/archive/html/parallel/2013-02/msg00018.html /usr/bin/sshpass:vm-centos:コマンドが見つかりません -p:vm-centos:コマンドが見つかりません 'test':vm-centos:コマンドが見つかりません /usr/bin/ssh:vm-centos:コマンドが見つかりません -o:vm-centos:コマンドが見つかりません – gosatriani

+0

あなたのディストリビューションに** GNU Parallel **の古いバージョンが同梱されていることを意味します。それを更新するか、単に 'parallel --gnu <その他のオプション>'を使ってください。あなたのバージョンは2014年以降です。 –

0

GNUパラレルがssh -commandを使用するように設定する--nonallオプションと環境変数を持っています

あなたが書いているよう
complex_task() { 
    # Do complex task 
    echo test | sudo -S yum update -y 
    # and a lot more complex stuff 
} 
export -f complex_task 
PARALLEL_SSH="/usr/bin/sshpass -p test /usr/bin/ssh -o StrictHostKeyChecking=no -l testuser -t" 
export PARALLEL_SSH 
parallel --slf /root/vms --env complex_task --nonall complex_task 
関連する問題