私は次のスクリプトを並列化しようとしています。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
私は次のスクリプトを並列化しようとしています。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
このようなパラレルあなたがGNUとかなり簡潔にそれを行うことができます
/usr/bin/sshpass ... &
ここではforループが連続して実行されています。 forループを並列に実行したい。 – gosatriani
これがこの変更の仕組みです。あなたのファイル/ root/vmsが20行含まれている場合、これは20のsshpass並列を開始します。 – Cyrus
@gosatriani、どうやってあなたの "*連続実行*"を実現していますか?技術的には、このアプローチはバックグラウンドジョブとして各コマンドを起動します。上記のコマンドを使用すると、 – RomanPerekhrest
で
/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
を並列実行していますが、いくつかの構文エラーが並行して起こります。警告:あなたは--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
あなたのディストリビューションに** GNU Parallel **の古いバージョンが同梱されていることを意味します。それを更新するか、単に 'parallel --gnu <その他のオプション>'を使ってください。あなたのバージョンは2014年以降です。 –
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
:あなたは、あなたがもう少し複雑な関数を作成し、GNUパラレル転送することができている実行したい* forループは*を - あなたはワン行います並列に複数の 'for'ループを実行するには?その場合は、ループの数を指定する必要があります – RomanPerekhrest