2

Я пытаюсь запустить серию заданий, переданных в кластер, одно за другим, используя следующий сценарий .sh:

Annotation_Loop.sh:

#!/bin/bash

job=`qsub run_IntersectBed_1.sh 0`
for i in {1..3}
do
    job_next=`qsub -hold_jid $job run_IntersectBed_1.sh $i`
    job=$job_next
done

Первая задача (до входа в цикл) выполняется, но следующие никогда не запускаются.

Я думаю, что сценарий хорошо написан. Я изменяю режим на исполняемый файл и запускаю его как

nohup ./Annotation_Loop.sh (я думаю, что это необходимо?) ... но остальное никогда не делается.

Я пробовал -W раньше, используя -W depend=afterok:$job вместо -hold_jid $job

#!/bin/bash

    job=`qsub run_IntersectBed_1.sh 0`
    for i in {1..3}
    do
        job_next=`qsub -W depend=afterok:$job run_IntersectBed_1.sh $i`
        job=$job_next
    done

Но вернул unknown option -W .

Что может быть не так? :(

2 ответа2

1

Выход qsub имеет идентификатор задания внутри текста сообщения. В моем случае:

$ qsub hello.sh
Your job 8845476 ("hello.sh") has been submitted

Вы должны извлечь jobid из этого сообщения. Например:

$ jobid=$(qsub hello.sh | cut -d' ' -f3)
$ echo $jobid
8845481

Возможно, ваша версия qsub имеет другое сообщение, попробуйте ее отдельно, а затем добавьте вырез, чтобы получить jobid в виде строки.

0

Для тех, кто наткнулся через это годы:

Я бы использовал для этого задачу массива , чтобы избежать написания сценария оболочки. Вам нужно что-то вроде run_IntersectBed_1.sh $SGE_TASK_ID и вам нужно отправить с помощью qsub -t 1-3 -tc 1 Annotation_Loop.sh

Это создает массив из 3 заданий, пронумерованных 1, 2 и 3, которые выполняются по одному за раз (-tc 1). Вам больше не нужно беспокоиться о hold_jid .

SGE_TASK_ID - это место, где хранится целочисленный идентификатор текущего задания. Это то, что вы передаете в свой код (эквивалент i в вашем цикле).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .