bash - вывести фоновый скрипт на передний план после смерти родителя

Я пишу скрипт, который будет запускаться со съемного носителя, но требует, чтобы этот носитель был размонтирован во время выполнения. Он не может просто сделать это прямо, потому что тогда среда занята. Таким образом, я разделил скрипт на 2 части: одна выполняется перед размонтированием, которая копирует вторую часть скрипта в ramfs и запускает ее, вторая часть размонтирует madia, выполняет работу, а затем самоудаляется и размонтирует созданные ramfs. Но проблема в том, что асинхронный скрипт запускается при запуске bash на переднем плане, и я не знаю, как этот скрипт может программно вывести себя на передний план для получения пользовательского ввода.

Итак, мне нужно что-то вроде этого:

script1 does his job
script1 starts script2
script1 dies
script2 goes to foreground
script2 unmounts media with script1
script2 does his job
scirpt2 starting async command and dies
async command unmounts ramfs

person Lapsio    schedule 29.07.2015    source источник


Ответы (1)


Вы хотите wait:

script1 &
JOB_SCRIPT1=$!
script2 &
JOB_SCRIPT2=$!
wait $JOB_SCRIPT1
echo "this action takes place after script1 but perhaps during script2"
wait $JOB_SCRIPT2
echo "now both jobs are complete"
async command unmounts ramfs

Однако, похоже, это не совсем то, что вы хотите; похоже, что есть некоторые фоновые задания, запущенные script1. Это сложнее контролировать. Возможно, попробуйте wait без аргументов и посмотрите, улавливает ли это тот факт, что существуют фоновые процессы (но я сомневаюсь, поскольку они не являются частью одной и той же оболочки):

script1 &
wait
script2
async command unmounts ramfs

(Амперсанд в этой версии на самом деле не должен ничего делать, но может указывать оболочке на то, что вы хотите. Вам придется попробовать, чтобы увидеть.)

person Adam Katz    schedule 29.07.2015
comment
но это трудно контролировать. Я имею в виду, что мне понадобится третий скрипт для запуска этой штуки, но тогда он должен быть на SD-карте, и он тоже не будет работать. Я хочу буквально набрать в оболочке: $ /drive/script.sh и войти в поток выполнения, который размонтирует /drive и сделает несколько других вещей, вызывающих вопросы. На самом деле мне удалось запустить script1, а затем запустить script2 после того, как script1 умирает, но тогда script2 не запускается как процесс переднего плана. Я пытался запустить (sleep 1 && script2) & ; exit 0 && fg из script1, но он выдает ошибку ввода-вывода, когда script2 вызывает read - person Lapsio; 30.07.2015