为什么我的 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