Eine im Hintergrund laufende komplexe Aufgabe dazu zwingen, sich selbst zu bearbeiten?

Eine im Hintergrund laufende komplexe Aufgabe dazu zwingen, sich selbst zu bearbeiten?

Ich führe häufig eine einfache Überwachungsaufgabe wie die folgende aus:

(sleep 600 && ls -lh /path/to/files)&

Ist es möglich, den Prozess zwischendurch aus dem Hintergrund zu holen? Um beispielsweise die Job-ID $jobid(oder etwas Ähnliches) zu übernehmen und dann, wenn der sleepProzess abgeschlossen ist, ein auszuführen fg $jobid?

Ich bin mir bewusst, dass hierfür möglicherweise etwas komplexeres Bash-Fu erforderlich ist, aber jede Lösung wäre nett (insbesondere, wenn dies nur möglich ist, fgwenn kein anderer interaktiver Prozess ausgeführt wird).

Antwort1

Bei einem nicht interaktiven Skript ist die Jobsteuerung standardmäßig deaktiviert, Sie können sie jedoch mit set -moder aktivieren set -o monitor. Hier ist ein Beispielskript:

# turn on job control
set -o monitor

# start a background task
( sleep 10 && echo "slept 10 seconds" ) &

# do something else
sleep 5
echo "slept 5 seconds"

# bring the background task into the foreground
fg

echo "done"

Hier ist die Ausgabe, wenn es mit tracing ( bash -x script.sh) ausgeführt wird:

+ set -o monitor
+ sleep 5
+ sleep 10
+ echo 'slept 5 seconds'
slept 5 seconds
+ fg
( sleep 10 && echo "slept 10 seconds" )
+ echo 'slept 10 seconds'
slept 10 seconds
+ echo done
done

verwandte Informationen