我的基本目标是尾部(而不是尾部-f)生成数据馈送的最新一批重复批处理作业的日志文件。这些作业可以在六个不同主机中的任何一个上运行。在另一台主机上有一个程序会告诉我特定批处理日期的特定作业的所有主机名都已运行。
所以基本流程是:
以下是代码:
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 guy与this 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;旗帜也无济于事。