Я запускаю несколько симуляций с использованием 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
текст. Поэтому я пришел к выводу, что файл не обновляется, если узел, выполняющий программу, занят. Итак, мой вопрос: есть ли способ обновить выходные файлы вручную или собрать какую-либо информацию о ходе выполнения программы в лучшем виде?
Уже спасибо
Максимум
То, что вы хотите сделать, это использовать параметры потокового вывода. Увидеть stream_error
а также stream_output
варианты, которые вы можете передать condor_submit
как указано здесь: http://research.cs.wisc.edu/htcondor/manual/current/condor_submit.html
По умолчанию HTCondor хранит stdout и stderr локально на узле выполнения и передает их обратно на узел отправки после завершения задания. настройка stream_output
в TRUE
попросит HTCondor вместо этого передать поток, как это происходит, обратно на узел отправки. Затем вы можете проверить это, как это происходит.
Вот кое-что, что я использовал несколько лет назад, чтобы решить эту проблему. Оно использует 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 секунд. Вы можете настроить это.
с condor_tail
Вы можете просмотреть вывод работающего процесса.
чтобы увидеть стандартный вывод, просто добавьте идентификатор задания (и -f, если хотите проследить за выводом и сразу увидеть обновления. Пример:
condor_tail 314.0 -f