2016-08-08 4 views
0

Ich habe ein Array von Argumenten, die als solche im Befehl für mein Shell-Skript verwendet werden. Ich möchte in der Lage, dieseSo erstellen Sie mehrere Threads in Bash Shell-Skript

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

zu tun, wo jeder hier Befehl einen separaten Thread starten (zur Zeit sind wir Multithreading von mehreren Terminals zu öffnen und die Befehle beginnen dort)

ich die eingegebenen Befehle in gedrückt haben, ein Array:

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

Jetzt muss ich einen separaten Thread (oder Prozess) beim Durchschleifen Array starten. Kann mich jemand in die richtige Richtung führen? Meine Vermutung in sudo-Code ist so etwas wie

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

Bin ich auf dem richtigen Weg?

Antwort

1

Das ist kein Thread, aber ein background process. Sie sind ähnlich aber:

So können wir effektiv sagen, dass Threads und leichte Prozesse gleich sind. Der Hauptunterschied zwischen einem leichtgewichtigen Prozess (LWP) und einem normalen Prozess besteht darin, dass LWPs denselben Adressraum und andere Ressourcen wie offene Dateien usw. teilen. Da einige Ressourcen gemeinsam genutzt werden, werden diese Prozesse im Vergleich zu anderen als gering eingestuft zu anderen normalen Prozessen und daher den Namen leichte Prozesse.

NB: Redordered für Klarheit

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

Sie können den im Hintergrund laufenden Prozess mit dem jobs Befehl sehen. Z.B .:

[email protected]:~/test/npm-test$ sleep 10000 & 
[1] 23648 
[email protected]:~/test/npm-test$ jobs 
[1]+ Running  

Sie können sie in den Vordergrund bringen fg mit:

[email protected]:~/test/npm-test$ fg 1 
sleep 1000 

, wo der Cursor wartet bis der Ruhezeit abgelaufen ist.Sie können den Job pausieren, wenn es im Vordergrund ist (wie im Szenario nach fg 1) durch CTRL-Z (SIGTSTP) drücken, die so etwas wie dies gibt:

[1]+ Stopped     sleep 1000 

und es wieder aufnehmen, indem Sie eingeben:

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

und man kann es töten, indem sie CTRL-C (SIGINT) drücken, wenn es im Vordergrund ist, die nur den Prozess endet, oder durch den Kill-Befehl mit den % unter Verwendung bringen an die jobs ID:

kill %1 # Or kill <PID> 

Auf Ihre Implementierung:

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

Tadaaa:

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 

Kann als genannt werden.

+0

Vielen Dank das funktioniert :) –

+0

@ D.Arnold Super! Denken Sie daran, die Antwort zu akzeptieren. –

Verwandte Themen