Bash读取不处理来自另一个bash循环的每一行输入

时间:2014-08-04 22:37:17

标签: bash

我的基本目标是尾部(而不是尾部-f)生成数据馈送的最新一批重复批处理作业的日志文件。这些作业可以在六个不同主机中的任何一个上运行。在另一台主机上有一个程序会告诉我特定批处理日期的特定作业的所有主机名都已运行。

所以基本流程是:

  1. 我从主持人
  2. 中检索当前正在运行的批处理作业的名称
  3. 使用此列表,我将ssh发送到另一台主机,并获取每个作业运行的主机列表。我通过tail -1运行它以检索最新的运行。
  4. 然后我ssh到该主机并找到最新的日志文件并运行" tail"在它上面。
  5. 以下是代码:

    for FEED in f1 f2 f3 f4 f5 f6 f7
    do
      /home/checkdep.pl $(cat /tmp/showq.tmp | grep ^20 | grep "\_"${FEED} | sort | head -n 1 | awk '{print $1}') | grep -vi blocked | sed '/^$/d' | tail -1 | sed 's/\|//g' | sed 's/__//g' | sed 's/ //g'
    done | sort -u | while read JOB
    do
      HOSTNAME=$(ssh  ${SCHED} "host -j ${JOB} | tail -1" | awk '{print $3}')
      LOGNAME=$(ssh ${HOSTNAME} "ls -rt /logs/pipeline_worker/job${JOB}.e* | tail -1")
      echo
      echo -e "${JOB}\n" $(ssh ${HOSTNAME} "tail ${LOGNAME}")
      echo
    done
    

    问题是它只会丢失一个日志文件。如果我在第二对" do"之间替换代码。和"完成"并且只是回应" JOB"它正确返回一个作业列表。但出于某种原因,即使只是

      HOSTNAME=$(ssh  ${SCHED} "host -j ${JOB} | tail -1" | awk '{print $3}')
    
    第二个循环中的

    会导致它做同样的事情。只检索一个HOSTNAME。

    我尝试过这样做,它做同样的事情:

    while read JOB
    do
      HOSTNAME=$(ssh  ${SCHED} "host -j ${JOB} | tail -1" | awk '{print $3}')
      LOGNAME=$(ssh ${HOSTNAME} "ls -rt /logs/pipeline_worker/job${JOB}.e* | tail -1")
      echo
      echo -e "${JOB}\n" $(ssh ${HOSTNAME} "tail ${LOGNAME}")
      echo
    done < <(for FEED in f1 f2 f3 f4 f5 f6 f7; do  /home/dp/checkdep.pl $(cat /tmp/showq.tmp | grep ^20 | grep "\_"${FEED} | sort | head -n 1 | awk '{print $1}') | grep -vi blocked | sed '/^$/d' | tail -1 | sed 's/\|//g' | sed 's/__//g' | sed 's/ //g';  done | sort -u )
    

    所以我很难过我在这里做错了什么。

    更新:that other guythis other question相关联,这似乎是合适的。

    但是根据链接问题的建议运行更新版本:

    for FEED in f1 f2 f3 f4 f5 f6 f7
    do
      /home/dp/checkdep.pl $(cat /tmp/showq.tmp | grep ^20 | grep "\_"${FEED} | sort | head -n 1 | awk '{print $1}') | grep -vi blocked | sed '/^$/d' | tail -1 | sed 's/\|//g' | sed 's/__//g' | sed 's/ //g';  done | sort -u | while read JOB
    do
      HOSTNAME=$(ssh  ${SCHED} "host -j ${JOB} | tail -1" | awk '{print $3}' < /dev/null)
      LOGNAME=$(ssh ${HOSTNAME} "ls -rt /logs/pipeline_worker/job${JOB}.e* | tail -1" < /dev/null)
      echo
      echo -e "${JOB}\n" $(ssh ${HOSTNAME} "tail ${LOGNAME}")
      echo
    done
    

    也不起作用。而是返回此错误消息:

    Pseudo-terminal will not be allocated because stdin is not a terminal.
    ssh: ls -rt /logs/pipeline_worker/job2014080416-A_JOB.e* | tail -1: hostname nor servname provided, or not known
    
    Pseudo-terminal will not be allocated because stdin is not a terminal.
    ssh: tail : hostname nor servname provided, or not known
    

    我遇到了&#34;而不是终端&#34;之前使用&#34; -t&#34;解决它ssh的标志。但这只会导致

    tcgetattr: Inappropriate ioctl for device
    Connection to host.com closed.
    

    使用&#34; -n&#34;用其他问题的评论之一建议用ssh标记,就像之前一样只返回一个日志尾。

    将ssh与&#34; -n&#34;和&#34; -t&#34;旗帜也无济于事。

0 个答案:

没有答案