Запустить сценарий после завершения другого (уже запущенного)

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

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

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

9 ответов

Решение

Голосование, вероятно, способ пойти, но это не должно быть ужасно.

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script

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

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

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

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

fg; echo "first job finished"

Вы можете wait уже запущенный процесс с использованием встроенной команды bash wait, человек баш

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

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

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

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

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

смотреть -g PS -opid -p {targetPID}; команда

Вы можете использовать эту команду для запуска определенной команды после завершения процесса. Процесс идентифицируется по его PID.

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

nohup bash script1.sh &

Подождите

nohup bash script2.sh &

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

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

позвонить SCRIPT_2

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

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

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

Другие вопросы по тегам