Начните независимые шаги работы и отслеживайте самый высокий код выхода - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу запустить много независимых задач (этапов работы) как часть одной работы и хочу отслеживать самый высокий код завершения всех этих задач.

Вдохновленный этим вопросом В настоящее время я делаю что-то вроде

#SBATCH stuf....

for i in {1..3}; do
    srun -n 1 ./myprog ${i} >& task${i}.log &
done

wait

в моем jobs.sh, который я sbatch, чтобы начать мои задачи.

Как определить переменную exitcode, которая после команды ожидания содержит самый высокий код завершения всех задач?

Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы можете использовать GNU параллельно в ваших интересах в таком случае:

#SBATCH stuf....

parallel --joblog ./jobs.log -P 3 "srun -n1 --exclusive ./myprog {} >& task{}.log " ::: {1..3}

Это будет выполнено srun ./mprog три раза с аргументами соответственно 1, 2 и 3 и перенаправит вывод на три файла с именами task1.log, task2.log и task3.log, как это делает ваш for -loop.

С помощью опции --joblog он, кроме того, создаст файл jobs.log, который будет содержать некоторую информацию о каждом запуске, в том числе код завершения, в столбце 7. Затем вы можете извлечь максимум с помощью

awk 'NR>1 {print $7}' jobs.log | sort -n | tail -1 
0 голосов
/ 03 сентября 2018

Вы можете хранить пиды заданий в массиве и ждать каждого из них, как это

#SBATCH stuf....

for i in {1..3}; do
    srun -n 1 ./myprog ${i} >& task${i}.log &
    pids+=($!)
done

for pid in ${pids[@]}; do
    wait $pid
    exitcode=$[$? > exitcode ? $? : exitcode]
done

echo $exitcode
...