Применить в одной команде bsub фоновый амперсанд оболочки Bourne

Я хотел бы использовать фоновый амперсанд оболочки Bourne как часть ОДНОЙ команды выполнения bsub.

Обратите внимание, что я хочу использовать не файл .bash, а одну командную строку bsub для выполнения всей процедуры.

Обратите внимание, что я также не хочу разбивать свой контент bsub на несколько команд bsub, которые ожидают друг друга, а скорее обернуть в одну командную строку bsub несколько внутренних команд unix, которые ожидают друг друга, используя фоновый амперсанд оболочки Bourne. .

следующая попытка привела к выводу только первой внутренней команды (команды liftOver), но ни sort, ни mv не были выполнены.

bsub -q medium -J $i "liftOver $i mm10ToMm9.over.chain.gz ${i/.bed/.mm9.bed} ${i/.bed/.unlifted_to_mm9.bed} & sort -k1,1 -k2,2n ${i/.bed/.mm9.bed} > ${i/.bed/.mm9.bed}.srt & mv ${i/.bed/.mm9.bed}.srt ${i/.bed/.mm9.bed}"

Вне bsub эта процедура может быть записана следующим образом:

liftOver $i mm10ToMm9.over.chain.gz ${i/.bed/.mm9.bed} ${i/.bed/.unlifted_to_mm9.bed} & 
sort -k1,1 -k2,2n ${i/.bed/.mm9.bed} > ${i/.bed/.mm9.bed}.srt & 
mv ${i/.bed/.mm9.bed}.srt ${i/.bed/.mm9.bed}

person Roy    schedule 23.02.2016    source источник
comment
Вы можете разделить отдельные команды с помощью ';', и, если я правильно помню, bsub также позволяет читать команду со стандартного ввода, что означает, что вы можете передать три строки. Однако, почему вы хотите выполнять три команды параллельно???? Нет смысла начинать mv, пока не закончен sort.   -  person user1934428    schedule 23.02.2016
comment
хорошо, моя ошибка. три команды были фактически разделены ; в завершение bsub, но хотя они были разделены ; они начали работать параллельно, а я хочу, чтобы они ждали друг друга. Я не уверен, что всегда могу передавать все свои команды (поскольку в некоторых случаях некоторые команды требуют создания выходного файла). Я хочу избежать запуска mv перед сортировкой.   -  person Roy    schedule 23.02.2016
comment
Вопрос: Что такое bsub? В чем разница с командой cron batch?   -  person F. Hauri    schedule 23.02.2016
comment
@Roy: точка с запятой говорит, что команды запускаются последовательно. Вы также можете использовать && в качестве разделителя, что означает, что следующая команда выполняется только в том случае, если предыдущая имеет код выхода 0. Если вы используете &, вы переводите команды в фоновый режим, и они выполняются параллельно.   -  person user1934428    schedule 23.02.2016
comment
@F.Hauri: это команда, принадлежащая коммерческому продукту под названием LSF. Вы отправляете задание на ферму процессоров, и LSF пытается выполнить некоторую балансировку нагрузки.   -  person user1934428    schedule 23.02.2016
comment
@user1934428 user1934428 Хорошо, я нашел несколько документов ... Я думаю, что мой ответ может быть трюком   -  person F. Hauri    schedule 23.02.2016
comment
@F.Hauri: Отлично, я не знал о <<< и всегда использовал echo ....| в таком случае. Очень удобно!   -  person user1934428    schedule 24.02.2016


Ответы (1)


Я не знаю, bsub но, может быть, я мог бы дать вам хитрость, которую я использую с batch, ssh и некоторыми другими различными оболочками:

bsub -q medium -J $i <<<"liftOver $i mm10ToMm9.over.chain.gz ${i/.be/.mm9.bed} ${i/.bed/.unlifted_to_mm9.bed} &&
     sort -k1,1 -k2,2n ${i/.bed/.mm9.bed} > ${i/.bed/.mm9.bed}.srt &&
     mv ${i/.bed/.mm9.bed}.srt ${i/.bed/.mm9.bed}"

Возможно, вам придется изменить двойные кавычки (") на кавычки ('), если $i должен быть разработан bsub (опять же, я не знаю этот продукт)

or

bsub -q medium -J $i <<-eocmd
    liftOver $i mm10ToMm9.over.chain.gz ${i/.be/.mm9.bed} \
         ${i/.bed/.unlifted_to_mm9.bed} &&
    sort -k1,1 -k2,2n ${i/.bed/.mm9.bed} > ${i/.bed/.mm9.bed}.srt &&
    mv ${i/.bed/.mm9.bed}.srt ${i/.bed/.mm9.bed}
        eocmd

(предупреждение: перед словом eocmd можно поставить только табуляцию $'\t')

Опять же, вам, возможно, придется экранировать знак $, если $i должен быть разработан bsub.

Чтобы обойти $TERM среда не установлена, я иногда использую:

bsub -q medium -J $i /bin/bash <<-eocmd
    ...
        eocmd

В надежде, что это поможет.

person F. Hauri    schedule 23.02.2016
comment
большое спасибо @F. Хаури. Ваше решение работает для меня! Это окончательная версия, которую я теперь использую в своем коде: * обратите внимание, что действительно вторая команда - awk - где бы ни использовались знак доллара или знаки ( ), они должны быть экранированы ( \ ) Именно то решение, которое я искал! Tnx bsub -q medium -J $i ‹‹‹liftOver $i mm10ToMm9.over.chain.gz ${i/.bedGraph/.mm9.bedGraph} ${i/.bedGraph/.unlifted_to_mm9.bedGraph} && sort -k1 ,1 -k2,2n -k3,3n ${i/.bedGraph/.mm9.bedGraph}| awk '!x[\$1,\$2,\$3]++' FS=\\\t\ › ${i/.bedGraph/.mm9.srt.bedGraph} && mv ${i/.bedGraph/.mm9 .srt.bedGraph} ${i/.bedGraph/.mm9.bedGraph} - person Roy; 23.02.2016