6

У меня есть ситуация, когда я запускаю две команды (они переходят в фоновый режим (nohup)), возвращаются через 2 часа, и, если обе команды выполнены, запускают еще две команды (снова nohup), снова возвращаются через 2 часа и запускают еще две команды и так далее ..

Мне было интересно, можно ли мне поставить их в очередь, чтобы после первых двух финишных, следующие два запускались автоматически, чтобы мне не нужно было проверять каждые 2 часа?

Все это независимые программы; это симуляции, которые требуют много памяти и ресурсов процессора, поэтому я не хочу, чтобы одновременно работало более двух из них.

Я запускаю их, используя синтаксис, похожий на:

nohup mySimulator inputs1.txt
nohup mySimulator inputs2.txt
nohup mySimulator inputs3.txt [after the first two have completed, that is..]

3 ответа3

8

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

nohup mySimulator inputs1.txt
nohup mySimulator inputs2.txt
while (ps -A | grep -v grep | grep mySimulator > /dev/null); do sleep 1; done
nohup mySimulator inputs3.txt

Затем запустите его из оболочки

Он запускает два симулятора, затем ждет, пока в списке процессов не появится mySimulator, и затем продолжает.

(Это было запущено на Mac, поэтому в зависимости от вашей операционной системы может потребоваться небольшая настройка ... ps -A должен печатать список всех запущенных процессов)

8

используйте команду wait , но не используйте nohup.

command1 &
command2 &
wait        # this waits for command1 and command2
command3 &
command4 &

от man bash:

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

2

Вы можете использовать оператор bash && . Это похоже на трубу | оператор, за исключением того, что он не передает вывод следующей команде. Вместо этого он связывает их вместе, поэтому выполнение продолжается до тех пор, пока одна из команд не обнаружит ошибку.

Например:

echo "Test" && echo "Test done." && echo "Test2" && echo "Test2 done."

Это остановит ошибку скрипта или любой скрипт, который возвращает false . Например:

echo "Test" && echo "Test done." && echo "Test2" && echo "Test2 done." && false && echo "This will never trigger."

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .