Linux bash脚本中的多线程
我运行一个bash脚本,并在文本文件中循环尽可能多的行。要卷曲txt文件中列出的站点 这是我的剧本:Linux bash脚本中的多线程,linux,bash,shell,ubuntu-16.04,Linux,Bash,Shell,Ubuntu 16.04,我运行一个bash脚本,并在文本文件中循环尽可能多的行。要卷曲txt文件中列出的站点 这是我的剧本: SECRET_KEY='zuhahaha' FILE_NAME="" case "$1" in "sma") FILE_NAME="sma.txt" ;; "smk") FILE_NAME="smk.txt" ;; "smp")
SECRET_KEY='zuhahaha'
FILE_NAME=""
case "$1" 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 : $1" \
"Executed at : $(date)" \
"Response Body : $2" \
"====================================================================================================="$'\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
你应该能够相对容易地做到这一点。不要尝试为每个命令设置背景,而是将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个。我最喜欢的方法是生成一个文件,其中列出您希望执行的所有命令。如果您有执行操作的脚本,请创建如下文件:
$ cat commands.txt
echo 1
echo 2
echo $[12+3]
....
例如,这可能有数百个命令长
要并行执行每一行,请使用parallel命令,例如,在任何时候最多并行运行3个作业
$ cat commands.txt | parallel -j
1
2
15
对于curl示例,您可以生成数千个curl命令,每次并行执行30个。我怀疑您尝试在循环中分叉进程是否有效,因为您需要等待输出并将其放入变量中。您是否尝试过将while循环的内部提取到一个新的bash脚本中,然后在另一个进程中运行该脚本?如何将while循环的内部提取到一个新的bash脚本中?您通常使用命令(&after)进行多处理。但是,我不确定这是否是您想要的。我怀疑您尝试在循环中分叉进程是否有效,因为您需要等待输出并将其放入变量中。您是否尝试过将while循环的内部提取到一个新的bash脚本中,然后在另一个进程中运行该脚本?如何将while循环的内部提取到一个新的bash脚本中?您通常使用命令(&after)进行多处理。然而,我不确定这就是你想要的。