如何在Bash Shell脚本中创建多个线程

时间:2016-08-08 18:50:05

标签: bash shell

我有一个参数数组,将在我的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 &

我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:1)

这不是一个主题,而是一个background process。它们很相似,但是:

  

因此,有效地我们可以说线程和轻量级过程是相同的。

     

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

     

注意:为清晰起见重新排序

     

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

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

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

光标将等待,直到睡眠时间结束。您可以通过按fg 1CTRL-Z)暂停工作,因为它位于前台(如SIGTSTP之后的方案中),如下所示:

[1]+  Stopped                 sleep 1000

并输入以下内容恢复:

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

并且可以通过按CTRL-CSIGINT)将其删除,前提是刚刚结束进程,或者使用带有{{1}的kill命令附加到% ID:

jobs

在您的实施中:

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

Tadaaa。