bash 脚本中的多线程

Multithreading in bash scripting

我 运行 一个 bash 脚本,并在文本文件中循环尽可能多的行。卷曲 txt 文件中列出的网站。

这是我的脚本:

SECRET_KEY='zuhahaha'
FILE_NAME=""

case "" in
        "sma")     
            FILE_NAME="sma.txt"
        ;;
        "smk")      
            FILE_NAME="smk.txt"
        ;;
        "smp")      
            FILE_NAME="smp.txt"
        ;;
        "sd")      
            FILE_NAME="sd.txt"
        ;;
     *)
        echo "not in case !"
        ;;
esac

function save_log()
{
    printf '%s\n' \
    "Header Code    : " \
    "Executed at    : $(date)" \
    "Response Body  : " \
    "====================================================================================================="$'\r\n\n'  >> output.log
}

while IFS= read -r line; 
    do 
        HTTP_RESPONSE=$(curl -L -s -w "HTTPSTATUS:%{http_code}\n" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line 2>&1) &
        HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g') &
        HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') &

        save_log "$HTTP_STATUS" "$HTTP_BODY" &
done < $FILE_NAME

如何在 bash 中 运行 线程化或使循环变快?

您应该能够相对轻松地完成此操作。不要尝试为每个命令设置背景,而是将 while 循环的主体放入子 shell 和背景中。这样,您的命令(显然相互依赖)运行 顺序执行,但文件中的所有行都可以并行处理。

while IFS= read -r line; 
    do
       (
        HTTP_RESPONSE=$(curl -L -s -w "HTTPSTATUS:%{http_code}\n" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line 2>&1)
        HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
        HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')

        save_log "$HTTP_STATUS" "$HTTP_BODY" ) &
done < $FILE_NAME

我最喜欢的做法是生成一个文件,其中列出了您希望执行的所有命令。如果您有执行操作的脚本,请创建一个文件,例如:

$ cat commands.txt
echo 1
echo 2
echo $[12+3]
....

例如,这可能有数百条命令。

要并行执行每一行,请使用 parallel 命令,例如,最多同时执行 3 个作业 运行。

$ cat commands.txt | parallel -j
1
2
15

对于您的 curl 示例,您可以生成数千个 curl 命令,并在任何时候并行执行它们,比如 30 个。