Обновление выходного файла Condor

Я запускаю несколько симуляций с использованием Condor и закодировал программу так, чтобы она выводила статус прогресса в консоль. Это делается в конце цикла, где просто печатается текущее время (это также может быть процент или истекшее время). Код выглядит примерно так:

Е ( "СТАРТ");
while (programNeedsToRum) {

// Выполнить код повторяющийся код ...

// Распечатать обновление статуса программы
printf ("[% i:% i:% i] \ r \ n", часы, минуты, секунды);
}
Е ( "КОНЕЦ");

При нормальном выполнении (то есть в терминале / cmd / bash) это работает нормально, но узлы кондора, кажется, не printf() статус. Только после завершения симуляции все обновления статуса были выведены в файл, но он больше не используется. Мой файл * .sub, который я отправляю в condor, выглядит следующим образом:

вселенная = ваниль
исполняемый файл = программа
выход = выход / выход - $ (процесс)
ошибка = out / err - $ (процесс)
очередь 100

При отправке программа выполняется (это подтверждается в condor_q) и выходные файлы содержат это:

НАЧНИТЕ

Только после того, как программа закончила запуск своего соответствующего выходного файла, показывает (пример):

НАЧНИТЕ
[0: 3: 4]
[0: 8: 13]
[0:12:57]
[0:18:44]
КОНЕЦ

Пока программа выполняется, выходной файл содержит только START текст. Поэтому я пришел к выводу, что файл не обновляется, если узел, выполняющий программу, занят. Итак, мой вопрос: есть ли способ обновить выходные файлы вручную или собрать какую-либо информацию о ходе выполнения программы в лучшем виде?

Уже спасибо

Максимум

3

Решение

То, что вы хотите сделать, это использовать параметры потокового вывода. Увидеть stream_error а также stream_output варианты, которые вы можете передать condor_submit как указано здесь: http://research.cs.wisc.edu/htcondor/manual/current/condor_submit.html

По умолчанию HTCondor хранит stdout и stderr локально на узле выполнения и передает их обратно на узел отправки после завершения задания. настройка stream_output в TRUE попросит HTCondor вместо этого передать поток, как это происходит, обратно на узел отправки. Затем вы можете проверить это, как это происходит.

1

Другие решения

Вот кое-что, что я использовал несколько лет назад, чтобы решить эту проблему. Оно использует condor_chirp который используется для передачи файлов с хоста выполнения на отправителя. У меня есть скрипт Python, который выполняет программу, которую я действительно хочу запустить, и перенаправляет ее вывод в файл. Затем я периодически отправляю выходной файл обратно на хост отправки.

Вот обертка Python, stream.py:

 #!/usr/bin/python
import os,sys,time

os.environ['PATH'] += ':/bin:/usr/bin:/cygdrive/c/condor/bin'
# make sure the file exists
open(sys.argv[1], 'w').close()

pid = os.fork()
if pid == 0:
os.system('%s >%s' % (' '.join (sys.argv[2:]), sys.argv[1]))
else:
while True:
time.sleep(10)
os.system('condor_chirp put %s %s' % (sys.argv[1], sys.argv[1]))
try:
os.wait4(pid, os.WNOHANG)
except OSError:
break

И мой сценарий отправки. Проблема побежала sh hello.shи перенаправил вывод на myout.txt:

 universe                = vanilla
executable              = C:\cygwin\bin\python.exe
requirements            = Arch=="INTEL" && OpSys=="WINNT60" && HAS_CYGWIN==TRUE
should_transfer_files   = YES
transfer_input_files    = stream.py,hello.sh
arguments               = stream.py myout.txt sh hello.sh
transfer_executable     = false

Он отправляет вывод целиком, поэтому примите это во внимание, если у вас одновременно выполняется много заданий. В настоящее время он отправляет вывод каждые 10 секунд. Вы можете настроить это.

2

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

condor_tail 314.0 -f
1
По вопросам рекламы [email protected]