Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash脚本中的多线程_Linux_Bash_Shell_Ubuntu 16.04 - Fatal编程技术网

Linux bash脚本中的多线程

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")

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

这是我的剧本:

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)进行多处理。然而,我不确定这就是你想要的。