Запустить сценарий после завершения другого (уже запущенного) - PullRequest
56 голосов
/ 20 сентября 2011

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

Редактировать: Один из вариантов - опрашивать каждые x минуты, используя pgrep, и проверять, завершен ли процесс.Если это так, запустите другой.Однако мне не нравится это решение.

PS: оба скрипта bash, если это помогает.

Ответы [ 8 ]

57 голосов
/ 20 сентября 2011

Учитывая PID первого процесса, цикл

while ps -p $PID; do sleep 1; done ; script2

должен сделать свое дело.Это немного более стабильно, чем pgrep и имена процессов.

29 голосов
/ 23 февраля 2016

Может быть, вы можете сначала нажать Ctrl + Z и ввести

fg; echo "first job finished"
29 голосов
/ 20 сентября 2011

Опрос - это, вероятно, путь, но он не должен быть ужасным.

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script
21 голосов
/ 20 сентября 2011

Вы можете wait уже запустить процесс, используя встроенную команду bash wait. man bash .

wait [n ...] Ожидать каждый указанный процесс и возвращать его состояние завершения.Каждый n может быть идентификатором процесса или спецификацией задания;если задана спецификация задания, все процессы в конвейере этого задания ожидаются.Если n не задано, ожидаются все активные в данный момент дочерние процессы, а статус возврата равен нулю.Если n указывает несуществующий процесс или задание, статус возврата равен 127. В противном случае статус возврата является состоянием завершения последнего процесса или задания, которые ожидали.

2 голосов
/ 02 декабря 2012

Часто бывает, что в вашей программе запущено несколько демонов. В этом случае ваш pid будет массивом. Просто используйте:

PID = ($ (pidof -x имя_процесса)) # это сохраняет все PID данного процесса в массиве $ pid

Теперь просто измените код титона следующим образом:

while ps -p ${PID[*]}; do sleep 1; done ; script2

0 голосов
/ 28 мая 2018

У меня было такое же требование, и я решил его следующим образом:

while [[ "$exp" != 0 ]]; do
exp=$(ps -ef |grep -i "SCRIPT_1" |grep -v grep |wc -l)
sleep 5;
done

вызов SCRIPT_2

0 голосов
/ 24 июня 2017

Самый простой способ:

./script1.sh && ./script2.sh

&& говорит, что нужно дождаться успешного завершения script1, прежде чем перейти к script2.

0 голосов
/ 10 марта 2016

У меня была похожая проблема, и я решил ее следующим образом:

nohup bash script1.sh &

wait

nohup bash script2.sh &

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...