Есть несколько команд, которые я хотел бы запускать на сетке, используя 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 без, чтобы создать другой файл, содержащий команду?
В переназначения будет работать, если те, которые интерпретируются * shell *, а не python. – devnull
@devnull: Что ты имеешь в виду? Если я нахожу 'qsub echo 'hello world'> hello.txt' * напрямую * в оболочку, никогда не используя Python, я получаю описанную выше проблему, где' hello.txt' содержит текст 'Your job ...'. (Я покажу код Python только случайно, чтобы продемонстрировать, в чем дело, чтобы обойти). –
Не уверен, что я полностью понимаю вопрос, но вы можете сделать echo sleep 300 | qsub -o/foo -e/bar' для отправки стандарта в/foo, а стандартная ошибка - в/bar – spuder