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 sleep
Prozess 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, fg
wenn 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 -m
oder 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