編寫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',並確保包含句柄的進程列表符合您的期望。 –