2009-11-23 4 views
2

У меня есть унаследованный научный код, работающий на кластере Rocks, с SGE. У меня есть сценарий подачи задания на конкретный сценарий, который генерирует сценарии qsub (т. Е. Сценарий, который берет и запускает Sun Grid Engine).Устранение неполадок SIGTERM с тройником на кластере в рамках заданий SGE

В скрипте qsub вызывается мое устаревшее приложение. Это приложение отправляет его в STDOUT. SGE перехватывает STDOUT и направляет его в файл в домашнем каталоге пользователей, поэтому пользователь может видеть, как результаты собираются в реальном времени. Я хочу, чтобы это поведение поддерживалось, но в то же время я хочу прозрачно регистрировать весь вывод в фоновом режиме. Я решил, что тройка будет идеальной для достижения этого.

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

\$GMSCOMMAND | tee \$SCRATCHDIR/gamess_output.log 

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

Все отлично работает, если я перенаправляю вывод приложения в файл, затем загружаю файл после завершения приложения, но затем я не могу позволить пользователям просматривать результаты в реальном времени (что является важным требованием).

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

+0

Не могли бы вы попробовать заменить команду 'tee' на' cat' - чтобы увидеть, есть ли проблема в этом трубе? –

+0

Вы уверены, что это SIGTERM, а не SIGPIPE? Попробуйте установить strace -o tr.gms. $ SGE_JOBID для отслеживания системных вызовов и сигналов. Возможно, проследите как $ GMSCOMMAND, так и tee. –

ответ

1

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

Если вы не смогли обернуть «устаревшее приложение» своим собственным скриптом/приложением, чтобы выполнить перенаправление/дублирование.

+0

Спасибо Douglas, было бы неплохо, если бы мне разрешили изменить устаревшее приложение, но, как вопрос политики, я не могу этого сделать. – tramdas

+1

Хорошо, не могли бы вы попробовать заменить команду 'tee' на' cat' - посмотреть, не проблема ли это в трубе? –

+0

Действительно, '| cat' терпит неудачу так же | tee' делает, так что кажется, что проблема в трубе. Имея это в виду, я начинаю задумываться о некотором выполнении '$ GMSCOMMAND> $ outputfile' detached, а затем потоковом $ outputfile в STDOUT до EOF. Но прежде чем пытаться, мне действительно нужно правильно просмотреть документацию Sun Grid Engine, чтобы узнать, есть ли какая-то релевантная информация о настройке. Спасибо за вашу помощь до сих пор, если у вас есть какие-либо другие идеи, я все уши ... – tramdas

0

Если ваша проблема связана с трубами, вы можете обойти это, используя цикл «while/read» с заменой процесса. Это работает для вас?

while read line; do 
    echo "$line" 
    echo "$line" >> ${SCRATCHDIR}/gamess_output.log 
done <(${GMSCOMMAND}) 

 Смежные вопросы

  • Нет связанных вопросов^_^