编写shell脚本时遇到了一件很奇怪的事情。shell脚本中的奇怪输出
最初我有以下脚本。
OUTPUT_FOLDER=/home/user/output
HOST_FILE=/home/user/host.txt
LOG_DIR=/home/user/log
SLEEPTIME=60
mkdir -p $OUTPUT_FOLDER
while true
do
rm -f $OUTPUT_FOLDER/*
DATE=`date +"%Y%m%d"`
DATETIME=`date +"%Y%m%d_%H%M%S"`
pssh -h $HOST_FILE -o $OUTPUT_FOLDER
while read host
do
numline=0
while read line
do
if [[ $numline == 0 ]]
then
FIELD1=`echo $line | cut -d':' -f2 | cut =d' ' -f2`
fi
((numline+=1))
done < ${OUTPUT_FOLDER}/${host}
echo "$DATETIME,$FIELD1" >> ${LOG_DIR}/${DATE}.log
done < $HOST_FILE
sleep $SLEEPTIME
done
当我运行该脚本,每60秒,我会看到我的日志文件中的$DATETIME,$FIELD1
值。
非常奇怪的是,每隔30秒钟左右,在第一分钟过后,我会看到20160920_120232,
,这意味着有输出的地方不应该有,我猜是因为我删除了内容我的输出文件夹,FIELD1
是空的。
更奇怪的是,当试图调试这个时,我添加了几条echo
语句来打印到我的日志文件中,然后我删除了这些行。但是,在第一分钟过后,它们每30秒左右继续打印一次。
什么是陌生人还是那个我,然后注释掉一切while true
块内,也就是
OUTPUT_FOLDER=/home/user/output
HOST_FILE=/home/user/host.txt
LOG_DIR=/home/user/log
SLEEPTIME=60
mkdir -p $OUTPUT_FOLDER
while true
do
: << 'END'
rm -f $OUTPUT_FOLDER/*
DATE=`date +"%Y%m%d"`
DATETIME=`date +"%Y%m%d_%H%M%S"`
pssh -h $HOST_FILE -o $OUTPUT_FOLDER
while read host
do
numline=0
while read line
do
if [[ $numline == 0 ]]
then
FIELD1=`echo $line | cut -d':' -f2 | cut =d' ' -f2`
fi
((numline+=1))
done < ${OUTPUT_FOLDER}/${host}
echo "$DATETIME,$FIELD1" >> ${LOG_DIR}/${DATE}.log
done < $HOST_FILE
sleep $SLEEPTIME
END
done
即使这个剧本,在那里我期待什么可打印到我的日志文件,我请参阅我之前删除的echo
声明以及空行FIELD1
。我检查了我每次都运行正确的脚本版本。
这是怎么回事?
有没有你不知道的后台进程? – Jokester
您在进行更改后是否重新启动了此过程?并确保旧的过程真的没有运行? – yaccz
'fuser -k/path/to/file',确保写入该文件的所有内容都已经死了,是你的朋友。或者只是'fuser/path/to/file',并确保包含句柄的进程列表符合您的期望。 –