循环脚本只执行一次 - Bash

时间:2014-06-28 16:00:45

标签: bash hadoop

我有以下bash脚本:

#!/bin/bash
cat /etc/hadoop/conf.my_cluster/slaves | \
while read CMD; do
    ssh -o StrictHostKeyChecking=no ubuntu@$CMD "sudo service hadoop-0.20-mapreduce-tasktracker restart"
    ssh -o StrictHostKeyChecking=no ubuntu@$CMD "sudo service hadoop-hdfs-datanode restart"
    echo $CMD
done

/etc/hadoop/conf.my_cluster/slaves拥有5台从属机器的IP。 datanode无法与jobtracker进行通信,因此解决方案是重新启动它。 输出是:

ubuntu@domU-12-31-39-07-D6-DE:~$ ./test.sh 
Warning: Permanently added '54.211.5.233' (ECDSA) to the list of known hosts.
 * Stopping Hadoop tasktracker: 
stopping tasktracker
 * Starting Hadoop tasktracker: 
starting tasktracker, logging to /var/log/hadoop-0.20-mapreduce/hadoop-hadoop-tasktracker-domU-12-31-39-06-8A-27.out
Warning: Permanently added '54.211.5.233' (ECDSA) to the list of known hosts.
 * Stopping Hadoop datanode: 
stopping datanode
 * Starting Hadoop datanode: 
starting datanode, logging to /var/log/hadoop-hdfs/hadoop-hdfs-datanode-domU-12-31-39-06-8A-27.out
54.211.5.233

然而,在它应该运行的5个ip地址中,只执行了第一个。我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:5)

让我们问shellcheck

$ shellcheck yourscript

In yourscript line 3:
while read CMD; do
^-- SC2095: ssh may swallow stdin, preventing this loop from working properly.

In yourscript line 4:
    ssh -o StrictHostKeyChecking=no ubuntu@$CMD [...]
    ^-- SC2095: Add < /dev/null to prevent ssh from swallowing stdin.

然后你去。