Запуск одной и той же программы на нескольких ядрах процессора с помощью bash

Приведенная ниже функция выполняет команду в параметре 7, если процесс dialogзавершается с ненулевым -статусом выхода; иначе --если dialogуспешно завершится --функция выполнит команду в параметре 8.

function YesNoPrompt {
    if ! dialog --begin 2 1 --no-shadow --title "$1" --hline "$2" \
        --backtitle "$3" --yes-label "$4" --no-label "$5" \
        --yesno "$6" 26 38 20>&1 > /dev/tty
    then
      eval "$7"
    else
      eval "$8"
    fi
}

Я переработал логику с ||на полноценный -развернутый if/then/elseоператор; в противном случае ваша замена exit(, если это не exitили return), может позволить выполнить последующуюsudo reboot(или замену )на также . Предположительно, вы хотите, чтобы выполнялась только одна или другая команда. Я также привел все параметры.

evalнеобходим, если вы хотите передать более одного слова в качестве команды (, напримерsudo reboot). Обратите внимание, что evalзаставляет параметр пройти еще один цикл интерпретации оболочки, поэтому остерегайтесь таких вещей, как подстановочные знаки или другие расширения.

1
16.11.2020, 16:04
2 ответа

Если у вас есть GNU Parallel:

run_graph_algo1(){
 ./../bin/graph_algo1_cpp "$1" > "${1}.algo1.log"
}
export -f  run_graph_algo1

parallel -j3 run_graph_algo1 ::: *.txt

echo "All Instances have finsihed running."

GNU Parallel создан именно для таких задач.

2
18.03.2021, 22:49

РЕДАКТИРОВАТЬ :Это неправильное решение. Приведенная ниже программа запустит 3 отдельные задачи, но будет ждать завершения всех трех, а затем запустит следующие три задачи. Я хочу, чтобы следующая задача запускалась после завершения любой из трех задач, чтобы в любой момент времени (, за исключением ближе к концу, всегда выполнялись три задачи)

После дальнейших поисков я смог найти работающее решение. Но если кто-то может дать более элегантное решение, я бы отметил его как правильное.

run_graph_algo1(){
 ./../bin/graph_algo1_cpp "$1" > "${1}.algo1.log"
}
 
N=3
#N = 4 just preserving this mistake 

for file in *.txt
do
     ((i=i%N)); ((i++==0)) && wait
     run_graph_algo1 "$file" &
done

wait
echo "All Instances have finsihed running."
0
18.03.2021, 22:49

Теги

Похожие вопросы