Ответ 1
Опрос - это, вероятно, путь, но он не должен быть ужасным.
pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
sleep 1
done && ./your_other_script
Итак, у меня есть процесс, и для завершения потребуется несколько часов. Я хотел бы начать другой процесс сразу после того, как он закончится автоматически. Обратите внимание, что я не могу добавить вызов ко второму script в первый, не создавая другого, который последовательно запускает оба. Есть ли способ сделать это в Linux?
Изменить: один параметр - опросить каждую минуту x
с помощью pgrep и проверить, завершен ли процесс. Если это так, запустите другую. Тем не менее, мне это не нравится.
PS: Оба сценария bash, если это помогает.
Опрос - это, вероятно, путь, но он не должен быть ужасным.
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 и процессов.
Вы можете выполнить wait
уже запущенный процесс с помощью встроенной команды bash wait
. man bash.
wait [n...] Подождите каждого указанного процесса и верните его статус завершения. Каждый n может быть идентификатором процесса или спецификацией задания; если задана спецификация задания, все процессы в этом рабочем конвейере ждать кого-либо. Если n не задано, все активные в данный момент дочерние процессы ждут, а статус возврата равен нулю. Если n указывает несуществующий процесс или задание, статус возврата - 127. В противном случае Статус возврата - это статус выхода последнего процесса или задание для.
Возможно, вы можете сначала нажать ctrl + z и ввести
fg;"your second job"
Часто бывает, что в вашей программе несколько демонов. В этом случае ваш pid будет массивом. Просто используйте:
PID = ($ (pidof -x имя_процесса)) # это сохраняет все PID данного процесса в массиве $pid
Теперь просто измените титонный код как:
while ps -p ${PID[*]}; do sleep 1; done ; script2
У меня была аналогичная проблема и она была решена так:
nohup bash script1.sh &
ожидание
nohup bash script2.sh &
Самый простой способ:
./script1.sh && ./script2.sh
& говорит, что ждать успешного завершения скрипта1 перед тем, как перейти к сценарию2.