2013-08-19 3 views
2

Есть несколько команд, которые я хотел бы запускать на сетке, используя qsub (SGE 8.1.3, CentOS 5.9), которые должны использовать канал (|) или перенаправление (>). Например, предположим, что я должен распараллелить командуКак я могу использовать канал или перенаправить команду qsub?

echo 'hello world' > hello.txt 

(Очевидно, упрощенный пример: в реальности я, возможно, придется перенаправить вывод программы, как bowtie непосредственно samtools). Если бы я сделал:

qsub echo 'hello world' > hello.txt 

в результате содержание hello.txt будет выглядеть

Your job 123454321 ("echo") has been submitted 

Аналогично, если я использовал трубу (echo "hello world" | myprogram), что сообщение является все, что будет передан myprogram, а не фактическое стандартный вывод.

Я знаю, что могу написать небольшой скрипт bash, в котором каждая команда содержит команду pipe/redirect, а затем qsub ./myscript.sh. Тем не менее, я пытаюсь запустить много параллельных заданий в то же время, используя скрипт, поэтому мне пришлось бы написать много таких сценариев bash, каждый из которых имеет немного другую команду. При написании сценариев это решение может начать чувствовать себя очень хаки. Пример такого сценария в Python:

for i, (infile1, infile2, outfile) in enumerate(files): 
    command = ("bowtie -S %s %s | " + 
       "samtools view -bS - > %s\n") % (infile1, infile2, outfile) 

    script = "job" + str(counter) + ".sh" 
    open(script, "w").write(command) 
    os.system("chmod 755 %s" % script) 
    os.system("qsub -cwd ./%s" % script) 

Этого разочарование по нескольким причинам, среди них, что моя программа не может даже удалить многие jobXX.sh скриптов впоследствии убирать за собой, так как я не знайте, как долго работа будет ждать в очереди, и сценарий должен быть там, когда начинается задание.

Есть ли способ предоставить мою полную команду echo 'hello world' > hello.txt qsub без, чтобы создать другой файл, содержащий команду?

+0

В переназначения будет работать, если те, которые интерпретируются * shell *, а не python. – devnull

+0

@devnull: Что ты имеешь в виду? Если я нахожу 'qsub echo 'hello world'> hello.txt' * напрямую * в оболочку, никогда не используя Python, я получаю описанную выше проблему, где' hello.txt' содержит текст 'Your job ...'. (Я покажу код Python только случайно, чтобы продемонстрировать, в чем дело, чтобы обойти). –

+1

Не уверен, что я полностью понимаю вопрос, но вы можете сделать echo sleep 300 | qsub -o/foo -e/bar' для отправки стандарта в/foo, а стандартная ошибка - в/bar – spuder

ответ

5

Вы можете сделать это, превратив его в bash -c команду, которая позволяет поставить | в цитируемом заявлении:

qsub bash -c "cmd <options> | cmd2 <options>" 

Как @spuder отметил в комментариях, кажется, что в других версиях qsub (не Sge 8.1.3, который я использую), можно решить проблему с:

echo "cmd <options> | cmd2 <options>" | qsub 

, а также.

+0

Очевидно, что redirect '>' не работает с bash -c. Есть ли способ записи в файл? – highBandWidth

+0

@highBandWidth: для перенаправления на файл вы всегда можете использовать '-o outputfile.txt' в качестве аргумента для qsub –

+0

Несколько комментариев: 1. Метод' bash -c' работает для 'I', но не для'> ' , 2. «Эхо | Метод qsub' работает как с '' 'и'> '. 3. Метод '-o output.txt' также работает, но может не всегда быть желательным (например, для gzipped-вывода). – enricoferrero

2

Хотя мой ответ немного поздний, я добавляю его для всех входящих зрителей. Чтобы использовать pipe/direct и представить, что в качестве задания qsub вам нужно сделать пару вещей. Но, во-первых, использование qsub в конце такого канала, как вы делаете, приведет только к тому, что одно задание будет отправлено в очередь (т. Е. Ваш код будет запускаться последовательно, а не распараллеливаться).

  1. Запустить qsub с включенным двоичным режимом, поскольку поведение qsub по умолчанию скорее ожидает скомпилированный код. Для этого вы используете флаг «-b» для qsub, и вы избежите ошибок «команды, требуемой для двоичного режима» или «длина скрипта не соответствует объявленной длине».
  2. эхо каждого вызова qsub, а затем передать его оболочке.

Предположим, у вас есть файл params-query.TXT которые держат несколько команд бабочки и водопроводной вызовы на samtools следующего вида:

bowtie -q query -1 param1 -2 param2 ... | samtools ... 

Для отправки каждого запроса в виде отдельного задания первого подготовить свои единицы командной строки из STDIN через xargs STDIN. Обратите внимание, что цитаты вокруг фигурных скобок важны, если вы отправляете команду с конвейерными частями. Таким образом, весь ваш запрос обрабатывается одним модулем.

cat params-query.txt | xargs -i echo qsub -b y -o output_log -e error_log -N job_name \"{}\" | sh 

Если это не работает, как ожидалось, то вы, вероятно, лучше генерируя промежуточный выходной сигнал между бабочкой и samtools перед вызовом samtools принять этот промежуточный вывод. Вам не нужно будет изменить qsub вызов через xargs, но код в Params-query.txt должен выглядеть следующим образом:

bowtie -q query -o intermediate_query_out -1 param1 -2 param2 && samtools read_from_intermediate_query_out 

This page has interesting qsub tricks you might like

0
grep http *.job | awk -F: '{print $1}' | sort -u | xargs -I {} qsub {} 
Смежные вопросы