Избегайте печати кодов завершения задания в SGE с опцией -sync yes
У меня есть Perl-скрипт, который отправляет кучу заданий массива в SGE. Я хочу, чтобы все задания выполнялись параллельно, чтобы сэкономить мое время, а сценарий дождался их завершения, а затем перешел к следующему этапу обработки, который объединяет информацию из всех выходных файлов SGE и выдает окончательный результат.
Чтобы отправить все задания в фоновый режим, а затем ждать, я использую Parallel::ForkManager и цикл:
$fork_manager = new Parallel::ForkManager(@as);
# @as: Max nb of processes to run simultaneously
for $a (@as) {
$fork_manager->start and next; # Starts the child process
system "qsub <qsub_options> ./script.plx";
$fork_manager->finish; # Terminates the child process
}
$fork_manager->wait_all_children;
<next processing step, local>
Однако, чтобы "ожидающая" часть работала, мне пришлось добавить "-sync yes" в опции qsub. Но в качестве "побочного эффекта" SGE печатает код выхода для каждой задачи в каждом задании массива, и, поскольку существует много заданий, а отдельные задачи просты, это в основном делает мою оболочку непригодной из-за всех этих перехватывающих сообщений, в то время как Задания qsub запущены.
Как я могу избавиться от этих сообщений? Во всяком случае, мне было бы интересно проверить код выхода qsub для заданий (чтобы я мог проверить, что все прошло нормально до следующего шага), но не в одном коде завершения для каждой задачи (я в любом случае регистрирую ошибку задач с помощью опции -e) на случай, если мне это нужно).
1 ответ
Самое простое решение - перенаправить вывод из qsub куда-нибудь, т.е.
system("qsub <qsub options> ./script.plx >/dev/null 2>&1");
но это маскирует ошибки, которые вы, возможно, захотите увидеть. В качестве альтернативы, вы можете использовать open() для запуска подпроцесса и чтения его вывода, только печатая что-либо, если подпроцесс выдает ошибку.
У меня есть альтернативное решение для вас. Вы можете отправить задания в SGE без -sync y и записать идентификатор задания, когда qsub напечатает его. Затем превратите код суммирования и сбора результатов в последующее задание и отправьте его в зависимости от завершения первых заданий. Вы можете отправить это последнее задание с -sync y, чтобы ваш вызывающий скрипт ждал его завершения. Смотрите документацию по -hold_jid на странице справки qsub.
Кроме того, вместо того, чтобы ваш вызывающий скрипт решал, когда отправлять следующую работу (до вашего максимума), используйте опцию -tc в SGE, чтобы указать максимальное количество одновременных работ (обратите внимание, что -tc отсутствует на странице руководства, но это находится в выводе -help qsub). Это зависит от того, используете ли вы достаточно новую версию SGE, чтобы иметь -tc, конечно.