Обновленный ответ
Спасибо за ваш вклад. В свете этого я бы предложил вам использовать:
parallel --dry-run -k --halt now,success=1 python3 {}.py "$pass" ::: {1..9}
Пример вывода
python3 1.py "$pass"
python3 2.py "$pass"
python3 3.py "$pass"
python3 4.py "$pass"
python3 5.py "$pass"
python3 6.py "$pass"
python3 7.py "$pass"
python3 8.py "$pass"
python3 9.py "$pass"
Если это выглядит правильно, вы можете удалить --dry-run
и -k
и просто запустить:
parallel --halt now,success=1 python3 {}.py "$pass" ::: {1..9}
Оригинальный ответ
Я думаю, что вы можете использовать для этого GNU Parallel , в частности политику halt . Так, в качестве примера, запустите 10 заданий, которые спят по 10, 20, 30, 40 ... 100 секунд каждое и убивают остальных, как только кто-нибудь добьется успеха:
parallel --halt now,success=1 sleep {} ::: $(seq 10 10 100)
parallel: This job succeeded:
sleep 10
Если вы добавите -k
и --dry-run
после parallel
, вы увидите, что он запускает следующие задания:
parallel -k --dry-run --halt now,success=1 sleep {} ::: $(seq 10 10 100)
sleep 10
sleep 20
sleep 30
sleep 40
sleep 50
sleep 60
sleep 70
sleep 80
sleep 90
sleep 100
Еще один пример, который убивает выдающиеся рабочие места после достижения 20% рабочих мест:
parallel --halt now,success=20% sleep {} ::: $(seq 10 10 100)
parallel: This job succeeded:
sleep 10
parallel: This job succeeded:
sleep 20