gnu パラレル: 警告: タイムアウトによりジョブが終了しました。

gnu パラレル: 警告: タイムアウトによりジョブが終了しました。

リモートホストで複数のコマンドを実行しています。 SSHスクリプトから直接コマンドを渡すと機能し、他のスクリプトからパラメータに渡すと最初のホストの結果が表示され、ログイン直後にタイムアウトします。他のスクリプトでコマンドを渡して動作させるにはどうすればよいですか?それとも私のsshスクリプトが1つのホストでのみコマンドを実行するのはなぜですか?

#Linux ssh
My_ssh_function () {
    sudo sshpass -p "$1" ssh -q -o StrictHostKeyChecking=no  root@"$2" "$command_linux"
}
export -f My_ssh_function 
export -p command_linux
export -p file_with_targets_linux
export -p passwords
parallel -j 2 --tag My_ssh_function :::: "$passwords" "$file_with_targets_linux" 

他のファイルから渡されたコマンド:(他のスクリプトから上記のスクリプトに送信しない限り、うまくいきます。)

 ""/sbin/dmidecode | /usr/bin/grep "Product Name:" | /usr/bin/awk '{print $4, $5}' > /tmp/result && free -h --si |grep Mem | awk '{print $2}' >> /tmp/result && dmidecode -s system-serial-number >> /tmp/result && hostname |awk -F"." '{print $1}' >> /tmp/result && cat /tmp/result |xargs""
parallel: Warning: My_ssh_function host_password_string 135.121.157.80
parallel: Warning: This job was killed because it timed out:

答え1

例では何かが抜けました。がないため、例は完全ではありません--timeout

つまり、My_ssh_function期待どおりに機能していることをテストする必要があります。

だからこれを試してみてください:

# remove --tag from parallel
parallel --dryrun ... > myfile.sh
# Does myfile.sh contain what you expect now?
cat myfile.sh
# Does it run as you expect?
bash myfile.sh

一部のホストで動作している場合は、sshpass ... ssh一部のホストで失敗すると思います。

どのホストでも動作しない場合は、見積もりが間違っているようです。

個人的に私:

  • 削除済み:rootとして実行するsudo理由は不明です。sshpass
  • 使用しないでくださいsshpass。代わりにssh-copy-idユーザーを一度だけログインしてください。 SSHキーにはまだパスワードがありますが、ssh-agentログイン時にパスワードを入力する必要はありません。これにより、バックアップにアクセスする犯罪者が~/.sshあなたの鍵を使用できなくなります。
  • 一度設定すると、GNU Parallelを直接使用でき--ssh、ログイン--slfしてコマンドを使用--onallまたは--nonall実行できます。
  • この方法が動作している間、長い一行スクリプトをbash関数に変換してからリモートenv_parallelシステムにコピーすることを検討することができます。

このような:

at_startup() {
    # Add sshkey to sshagent unless already done
    if [ -e ~/.ssh/SSH_AUTH_SOCK ] ; then
        export SSH_AUTH_SOCK=`cat ~/.ssh/SSH_AUTH_SOCK`
    fi
    if [ -e ~/.ssh/SSH_AGENT_PID ] ; then
        export SSH_AGENT_PID=`cat ~/.ssh/SSH_AGENT_PID`
    fi
    if ssh-add -l ; then
        true
    else
        eval `ssh-agent` ssh-add ~/.ssh/id*[^b] &&
            echo $SSH_AUTH_SOCK > ~/.ssh/SSH_AUTH_SOCK &&
            echo $SSH_AGENT_PID > ~/.ssh/SSH_AGENT_PID
    fi
}

setup_ssh_keys_once() {
  setupone() {
    sshpass -p "$1" ssh-copy-id -o StrictHostKeyChecking=no  root@"$2"
  }
  export -f setupone
  parallel setupone :::: "$passwords" "$file_with_targets_linux" 
}

env_parallel --session

command_linux() {
  /sbin/dmidecode | /usr/bin/grep "Product Name:" | /usr/bin/awk '{print $4, $5}' > /tmp/result &&
    free -h --si |grep Mem | awk '{print $2}' >> /tmp/result &&
    dmidecode -s system-serial-number >> /tmp/result &&
    hostname | awk -F"." '{print $1}' >> /tmp/result &&
    cat /tmp/result |xargs
}

# Yes: env_parallel can copy a function to a remote server - even if it is not exported
env_parallel --ssh 'ssh -l root' --slf "$file_with_targets_linux" --nonall command_linux

関連情報