Shell: Как использовать экран и подождать пару фоновых процессов в скрипте оболочки - PullRequest
2 голосов
/ 20 июня 2011

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

У меня вопрос, как запустить сеанс экрана в сценарии оболочки и дождаться фоновогопроцессы до конца.

Ответы [ 2 ]

5 голосов
/ 20 июня 2011

Поиск в Google по запросу "экран сценариев" дает this в качестве первого результата.Похоже, вы можете создавать именованные сеансы экрана с screen -d -m -S nameOfSession.Затем screen -X -S <session name> screen создаст окно в сеансе экрана «nameOfSession».Вы можете связаться с этим окном 1 (то есть дать команды для запуска этого окна сеанса экрана 1), используя

screen -X -S test -p 1 stuff "your command here ^M"

"your_command_here" - это команда, которую вы хотите выполнить.^M является управляющим символом возврата каретки (вы нажимаете Ctrl-V, затем вводите / возвращаете в терминале).^ M, по сути, «нажимает возврат / ввод», так что команда запускается в этом сеансе экрана.Поиграйте с ним.

Поскольку вы хотите дождаться окончания выполнения ваших команд, я бы предложил разветвить процессы через амперсанд:

your_command & Сразу после этого идентификатор процессаразветвленный процесс в $ !.Вы можете дождаться завершения всех фоновых процессов, запустив wait.

Я бы предложил справочник по экрану .

2 голосов
/ 20 июня 2011

Вы не можете вызвать screen (или nohup) в запущенном процессе, вам нужно сделать screen script. Однако вы можете сделать то, что делает nohup, перехватить SIGHUP и перенаправить вывод в файл.

exec > OUT 2>&1
trap '' 1

Чтобы дождаться фоновых процессов, сохраните pid при его создании, а затем вызовите wait

foo&
PID1=$!
bar&
PID2=$1
wait $PID1 $PID2

Или же просто подождите, пока все закончится.

foo&
bar&
wait
...