автоматически получать результаты bsub

Я ищу некоторые общие советы, а не решение для кодирования. В основном при отправке задания через bsub я могу получить журнал Stdin/Stdout, указав любое из следующего:

bsub -o log.txt      % sends StdOut to log.txt
bsub -u me@email     % sends StdOut to email

они оба великолепны, но моя программа создает папку при отправке в bsub и сохраняет ее на удаленном сервере. по существу я хочу

а) получить папку и ее содержимое б) сделать это автоматически после завершения задания

так что технически я мог бы использовать scp -r, однако мне пришлось бы делать это вручную. не так уж плохо, если я получу уведомление по электронной почте, когда работа будет завершена, но все же - мне придется сделать это вручную.

так на б):

ну, я не вижу никакого специального флага для bsub, чтобы получить фактические результаты, только StdOut. Я полагаю, у меня мог бы быть сценарий, который использует sleep и устанавливает время задания (возможно, немного задержится на всякий случай), что-то вроде

#!/bin/bash

scp myfile.txt server:main/subfolder
ssh bsub < myprogram.sh -u my@email
sleep <job-time>
scp -r server:main/subfolder result_folder 

однако меня немного беспокоит выход из системы и т. д., а также завершение работы сценария до завершения задания.

У кого-нибудь есть предложения?

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

хоть шаг за шагом!


person brucezepplin    schedule 13.07.2015    source источник
comment
Если узлы выполнения имеют доступ к общему хранилищу, вы можете сделать копию внутри сценария задания. Если ваш администратор кластера не хочет, чтобы вы удерживали процессор при выполнении задачи ввода-вывода, вы можете сделать копию файла как команда post exec (например, bsub -Ep). Если исполнительный узел не имеет доступа к подходящему общему хранилищу, LSF имеет возможность копировать вывод обратно в узел отправки.   -  person Michael Closson    schedule 14.07.2015
comment
Если в системе установлен диспетчер данных платформы для LSF, вы можете вывести данные из задания.   -  person Hristo Iliev    schedule 14.07.2015


Ответы (2)


Вы можете сохранить папку с результатами на стандартный вывод в файл журнала. Затем распакуйте файл журнала, чтобы получить каталог.

Добавьте команду tar czf - ... в конец скрипта.

Если у вас есть другие данные, которые появляются в stdout сначала, переместите их в stderr вместо этого или выведите какую-нибудь уникальную строку перед tar, grep для нее и tar оттуда. Вот своего рода проверка принципа:

marker='#magic' # some unique string
log=/tmp/b # your logfile
echo 'test' >/tmp/a # just something to tar for this test

# -- in your script, at end --
#  echo "$marker"; tar cf - /tmp/a
# -- equivalent in this test:
(echo 'hello'; echo "$marker"; tar cf - /tmp/a) >$log

# -- to recover the tar --
start=$(grep -ab "$marker" <$log | awk -F: '{print 1+$1+length($2)}')
dd skip=1 bs=$start <$log |
tar tvf - # use tar x really
person meuh    schedule 13.07.2015
comment
извини @meuh - я пытаюсь заставить это работать. Я вижу, что могу создать /tmp/a и tmp/b, в которых они содержат слова hello и magic. Однако в LSF есть возможность отправить StdOut по электронной почте из программы. Вы говорите, что можно заархивировать каталог результатов, созданный программой, встроить его в StdOut, чтобы он был отправлен по электронной почте, а затем распаковать результаты на стороне клиента, чтобы получить каталог результатов? - person brucezepplin; 27.07.2015
comment
в принципе можно. очевидно, что передача информации в программу электронной почты будет ограничена тем, что эта программа хочет передать, по размеру и содержанию. Вам может понадобиться закодировать двоичный вывод tar через base64 или аналогичный кодировщик. И если данных слишком много, он, вероятно, урежет их. - person meuh; 27.07.2015

Вы можете отправить задание в режиме блокировки (bsub -K). Это заставляет команду bsub возвращаться только тогда, когда задание завершено или обнаружена ошибка.

Цитата из документации:

-K

Отправляет задание и ждет его завершения. Отправляет сообщение «Ожидание отправки» на терминал при отправке задания. Отправляет сообщение «Задание завершено» на терминал, когда задание выполнено. Если LSB_SUBK_SHOW_EXEC_HOST включен в lsf.conf, также отправляет сообщение «Запуск на хосте выполнения», когда задание начинает выполняться на хосте выполнения.

Вы не можете отправить другую работу, пока работа не будет завершена. Это полезно, когда для продолжения требуется завершение задания, например сценария задания. Если задание необходимо перезапустить из-за временных сбоев, bsub возвращает значение после успешного завершения задания. bsub завершает работу с тем же кодом выхода, что и задание, чтобы сценарии заданий могли выполнять соответствующие действия на основе кодов выхода. bsub завершает работу со значением 126, если задание было прекращено во время ожидания.

Вы не можете использовать параметр -K с параметрами -I, -Ip или -Is.

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

Вы также можете добавить к своему скрипту-оболочке префикс nohup, чтобы предотвратить его уничтожение в случае выхода из сеанса.

person Gowtham    schedule 03.10.2015