Заставить фоновую сложную задачу выполнить fg сама себя?

Заставить фоновую сложную задачу выполнить fg сама себя?

Я часто запускаю простую задачу мониторинга, например следующую:

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

Возможно ли, чтобы процесс сам по себе вышел из фона на полпути? Например, чтобы захватить идентификатор задания $jobid(или что-то подобное), а затем, когда он sleepзавершится, сделать fg $jobid?

Я знаю, что для этого может потребоваться более сложный bash-fu, но было бы неплохо увидеть любые решения (особенно, если это возможно только fgпри отсутствии других запущенных интерактивных процессов).

решение1

Неинтерактивный скрипт имеет отключенный по умолчанию контроль заданий, но вы можете включить его с помощью set -mили set -o monitor. Вот пример скрипта:

# 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"

Вот его вывод при запуске с трассировкой ( bash -x script.sh):

+ 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

Связанный контент