5 Stimmen

Prozesse parallel im Vordergrund starten

Ist es möglich, in Linux mit Bash parallele Prozesse im Vordergrund zu erzeugen? Zum Beispiel das Folgende:

top.sh

#!/bin/bash

./myscript1.sh &
./myscript2.sh &

wird zwei Prozesse parallel als Hintergrundthreads erzeugen. Ist es jedoch möglich, diese als Vordergrundthreads zu starten? Ziel ist es, myscript1.sh und myscript2.sh automatisch zu beenden, wenn top.sh beendet wird. Danke

7voto

Sie können nur einen Job im Vordergrund haben. Sie können Ihr Skript so reagieren lassen, dass es auf jedes Signal reagiert, das es erreicht, und das Signal an andere Jobs weiterleitet. Sie müssen sicherstellen, dass Ihr Skript in der Nähe bleibt, wenn Sie eine zentrale Möglichkeit haben möchten, die Unterprozesse zu beenden: Rufen Sie wait auf, damit Ihr Skript nicht beendet wird, bis alle Jobs gestorben sind oder das Skript selbst getötet wird.

#!/bin/bash
jobs=
trap 'kill -HUP $jobs' INT TERM HUP
myscript1.sh & jobs="$jobs $!"
myscript2.sh & jobs="$jobs $!"
wait

Sie können das Wrapper-Skript immer noch nur töten, indem Sie ihm ein Signal senden, das es nicht einfängt, wie z.B. SIGQUIT (das ich absichtlich weggelassen habe) oder SIGKILL (der nicht eingefangen werden kann).

Es gibt einen Weg, alle Prozesse im Vordergrund zu haben: Verbinden Sie sie durch Pipes. Ignorieren Sie SIGPIPE, damit der Tod eines Prozesses nicht den vorherigen tötet. Speichern und stellen Sie stdin und stdout über andere Dateideskriptoren wieder her, wenn Sie sie benötigen. Auf diese Weise werden das Skript und die Hintergrundaufgaben in derselben Prozessgruppe sein, sodass das Drücken von Strg+C sowohl das Wrapper-Skript als auch die Unterprozesse beendet. Wenn Sie das Wrapper-Skript direkt beenden, hat dies keine Auswirkungen auf die Unterprozesse; Sie können stattdessen die Prozessgruppe beenden, indem Sie das Negative der PID des Wrapper-Skripts übergeben (z.B. kill -TERM -1234).

trap '' PIPE
{
  myscript1.sh <&3 >&4 |
  myscript2.sh <&3 >&4
} 3<&0 4>&1

0voto

Ole Tange Punkte 29091

Mit GNU Parallel würde Ihr Skript folgendermaßen aussehen:

#!/bin/bash

parallel ::: ./myscript1.sh ./myscript2.sh

Oder sogar:

#!/usr/bin/parallel --shebang -r

./myscript1.sh
./myscript2.sh

Schauen Sie sich die Einführungsvideos an, um mehr zu erfahren: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X