Я часто запускаю простую задачу мониторинга, например следующую:
(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