【问题标题】:How to create Multiple Threads in Bash Shell Script [duplicate]如何在 Bash Shell 脚本中创建多个线程 [重复]
【发布时间】:2016-08-08 18:50:05
【问题描述】:

我有一个参数数组,将在我的 shell 脚本的命令中使用。我希望能够做到这一点

./runtests.sh -b firefox,chrome,ie

这里的每个命令都将启动一个单独的线程(目前我们通过打开多个终端并在那里启动命令来进行多线程)

我已将输入的命令推入数组:

if [[ $browser == *","* ]]; then
    IFS=',' read -ra browserArray <<< "$browser"
fi

现在我将不得不在遍历数组时启动一个单独的线程(或进程)。有人可以指导我正确的方向吗?我对 sudo 代码的猜测类似于

for (( c=0; c<${#browserArray}; c++ ))
    do
    startTests &

我走对了吗?

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    这不是线程,而是background process。它们相似,但:

    因此,实际上我们可以说线程和轻量级进程是相同的。

    轻量级进程 (LWP) 和普通进程之间的主要区别在于 LWP 共享相同的地址空间和其他资源,例如打开的文件等。由于某些资源是共享的,因此这些进程被认为是轻量级的其他正常进程,因此称为轻量级进程。

    注意:为了清楚起见重新排序

    What are Linux Processes, Threads, Light Weight Processes, and Process State

    您可以使用jobs 命令查看正在运行的后台进程。例如:

    nick@nick-lt:~/test/npm-test$ sleep 10000 &
    [1] 23648
    nick@nick-lt:~/test/npm-test$ jobs
    [1]+  Running    
    

    您可以使用fg 将它们带到前台:

    nick@nick-lt:~/test/npm-test$ fg 1
    sleep 1000
    

    光标将等待直到休眠时间结束。您可以通过按CTRL-Z (SIGTSTP) 在前台暂停作业(如fg 1 之后的场景),它会给出如下内容:

    [1]+  Stopped                 sleep 1000
    

    然后输入:

    bg 1    # Resumes in the background
    fg 1    # Resumes in the foreground
    

    当它在前台时,您可以通过按CTRL-C (SIGINT) 来杀死它,这只是结束进程,或者通过使用带有% 附加到jobs ID 的kill 命令:

    kill %1 # Or kill <PID>
    

    关于您的实施:

    BROWSERS=
    
    for i in "${@}"; do
        case $i in
            -b) 
               shift
               BROWSERS="$1"
               ;;
             *)
               ;;
        esac
    done
    
    IFS=',' read -r -a SPLITBROWSERS <<< "$BROWSERS"
    
    for browser in "${SPLITBROWSERS[@]}"
    do
        echo "Running ${browser}..."
        $browser &
    done
    

    可以称为:

    ./runtests.sh -b firefox,chrome,ie
    

    Tadaaa。

    【讨论】:

    • 非常感谢 :)
    • @D.Arnold 太棒了!记得接受答案。