Запустить сценарий после завершения другого (уже запущенного)
Итак, у меня запущен процесс, и он займет несколько часов. Я хотел бы начать другой процесс сразу после того, как тот автоматически завершится. Обратите внимание, что я не могу добавить вызов ко второму сценарию в первом и не создать другой, который последовательно запускает оба. Есть ли способ сделать это в 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.