为什么我的 nohup bash 脚本读取文件总是在文件结束前 6k 左右停止输出计数?
Why does my nohup bash script reading in file always stop outputting count around 6k before end of file?
我使用 nohup 到 运行 一个 bash 脚本来读取文件的每一行(并提取我需要的信息)。我已经将它用于多个具有不同行大小的文件,主要在 50k 到 100k 之间。但是无论我的文件有多少行,nohup 总是在最后一行之前 6k 左右停止输出信息。
我的脚本调用:fetchStuff.sh
#!/bin/bash
urlFile=
myHost='http://example.com'
useragent='me'
count=0
total_lines=$(wc -l < $urlFile)
while read url; do
if [[ "$url" == *html ]]; then continue; fi
reqURL=${myHost}${url}
stuffInfo=$(curl -s -XGET -A "$useragent" "$reqURL" | jq -r '.stuff')
[ "$stuffInfo" != "null" ] && echo ${stuffInfo/unwanted_garbage/} >> newversion-${urlFile}
((count++))
if [ $(( $count%20 )) -eq 0 ]
then
sleep 1
fi
if [ $(( $count%100 )) -eq 0 ]; then echo "$urlFile read ${count} of $total_lines"; fi
done < $urlFile
我这样称呼它:nohup ./fetchStuff.sh file1.txt &
我在 nohup.out 中获取计数信息,例如“文件 1 读取 60000 中的 100”、“文件 1 读取 60000 中的 200”等。
但它总是在文件结束前 6k 左右停止。
当我在 运行 文件上的脚本之后每次执行 tail nohup.out
时,我将这些作为 nohup.out 中的最后一行:
file1.txt read 90000 of 96317
file2.txt read 68000 of 73376
file3.txt read 85000 of 91722
file4.txt read 93000 of 99757
我不明白为什么它总是在文件结束前 6k 左右停止。 (我设置了睡眠计时器以避免淹没 api w/a 大量请求)。
循环会跳过以 html
结尾的行,并且它们不计入 $count
。所以我敢打赌 file1.txt
中有 6317 行以 html
结尾,file2.txt
中有 5376 行,依此类推。
如果您希望 $count
包含它们,请将 ((count++))
放在检查后缀的 if
语句之前。
while read url; do
((count++))
if [[ "$url" == *html ]]; then continue; fi
reqURL=${myHost}${url}
stuffInfo=$(curl -s -XGET -A "$useragent" "$reqURL" | jq -r '.stuff')
[ "$stuffInfo" != "null" ] && echo ${stuffInfo/unwanted_garbage/} >> newversion-${urlFile}
if [ $(( $count%20 )) -eq 0 ]
then
sleep 1
fi
if [ $(( $count%100 )) -eq 0 ]; then echo "$urlFile read ${count} of $total_lines"; fi
done < $urlFile
或者,您可以通过以下方式将它们排除在 total_lines
之外:
total_lines=$(grep -c -v 'html$' "$urlFile")
您可以使用
取消 if
语句
grep -v 'html$' "$urlFile" | while read url; do
...
done
我使用 nohup 到 运行 一个 bash 脚本来读取文件的每一行(并提取我需要的信息)。我已经将它用于多个具有不同行大小的文件,主要在 50k 到 100k 之间。但是无论我的文件有多少行,nohup 总是在最后一行之前 6k 左右停止输出信息。
我的脚本调用:fetchStuff.sh
#!/bin/bash
urlFile=
myHost='http://example.com'
useragent='me'
count=0
total_lines=$(wc -l < $urlFile)
while read url; do
if [[ "$url" == *html ]]; then continue; fi
reqURL=${myHost}${url}
stuffInfo=$(curl -s -XGET -A "$useragent" "$reqURL" | jq -r '.stuff')
[ "$stuffInfo" != "null" ] && echo ${stuffInfo/unwanted_garbage/} >> newversion-${urlFile}
((count++))
if [ $(( $count%20 )) -eq 0 ]
then
sleep 1
fi
if [ $(( $count%100 )) -eq 0 ]; then echo "$urlFile read ${count} of $total_lines"; fi
done < $urlFile
我这样称呼它:nohup ./fetchStuff.sh file1.txt &
我在 nohup.out 中获取计数信息,例如“文件 1 读取 60000 中的 100”、“文件 1 读取 60000 中的 200”等。
但它总是在文件结束前 6k 左右停止。
当我在 运行 文件上的脚本之后每次执行 tail nohup.out
时,我将这些作为 nohup.out 中的最后一行:
file1.txt read 90000 of 96317
file2.txt read 68000 of 73376
file3.txt read 85000 of 91722
file4.txt read 93000 of 99757
我不明白为什么它总是在文件结束前 6k 左右停止。 (我设置了睡眠计时器以避免淹没 api w/a 大量请求)。
循环会跳过以 html
结尾的行,并且它们不计入 $count
。所以我敢打赌 file1.txt
中有 6317 行以 html
结尾,file2.txt
中有 5376 行,依此类推。
如果您希望 $count
包含它们,请将 ((count++))
放在检查后缀的 if
语句之前。
while read url; do
((count++))
if [[ "$url" == *html ]]; then continue; fi
reqURL=${myHost}${url}
stuffInfo=$(curl -s -XGET -A "$useragent" "$reqURL" | jq -r '.stuff')
[ "$stuffInfo" != "null" ] && echo ${stuffInfo/unwanted_garbage/} >> newversion-${urlFile}
if [ $(( $count%20 )) -eq 0 ]
then
sleep 1
fi
if [ $(( $count%100 )) -eq 0 ]; then echo "$urlFile read ${count} of $total_lines"; fi
done < $urlFile
或者,您可以通过以下方式将它们排除在 total_lines
之外:
total_lines=$(grep -c -v 'html$' "$urlFile")
您可以使用
取消if
语句
grep -v 'html$' "$urlFile" | while read url; do
...
done