Редактировать :Я присоединился к дискорд-серверу Linux и спросил об этом, они сказали, что я должен был написать «/dev/sda» вместо «/dev/sda1»
Вы можете указать любой или все эти параметры в командной строке qsub
, а не в виде #PBS...
комментариев в скрипте.
напр. ваш пакетный скрипт может быть переписан -как:
qsub -l nodes=1:ppn=20,walltime=05:00:00 -m e -o default.out -e errorfile script.sh
Со всеми параметрами командной строки qsub script.sh
должен содержать только:
#!/bin/bash
module load R/4.0
Rscript ~/r_script1.R
Вы можете комбинировать оба метода предоставления опций для qsub. например.вы можете указать параметры -o
и -e
в командной строке, а остальные в скрипте в виде комментариев #PBS
:
$ qsub -o default.out -e errorfile script2.sh
script2.sh:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
module load R/4.0
Rscript ~/r_script1.R
Затем вы можете объединить это с циклом bash for
:
for i in {1..5} ; do
qsub -o "default.$i.out" -e "errorfile.$i" script2.sh
done
Если вам нужно передать значение переменной цикла $i
в сценарий, это возможно -, но есть несколько разных способов сделать это, в зависимости от того, какое программное обеспечение для управления кластером вы используете (, например. slurm или крутящий момент или что-то еще ). Одним из самых простых способов, который, вероятно, будет доступен независимо от того, какую версию qsub
вы используете, является использование опции qsub -v
.
напр. если вам нужно запускать разные сценарии R в каждом задании, r _script1.R, r _script2.R и т. д., вы можете использовать -v i
, чтобы $i
был доступен в среде сценария:
for i in {1..5} ; do
qsub -o "default.$i.out" -e "errorfile.$i" -v i script3.sh
done
script3.sh:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
module load R/4.0
Rscript ~/r_script"$i".R
Некоторые реализации qsub позволяют передавать аргументы сценарию непосредственно в командной строке, которые затем можно использовать как обычные позиционные параметры ($1, $2, $3 и т. д. )в сценарии.
Большинство (все? )реализации qsub
также поддерживают параметр -t
для указания массива заданий. Доступ к этому можно получить в сценарии задания с помощью переменной среды PBS _ARRAYID. например.
qsub script4.sh
script4.sh (использует перенаправление оболочки для файлов вывода и ошибок, а не параметры qsub -o
и -e
):
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
#PBS -t 1-5
module load R/4.0
Rscript ~/r_script"$PBS_ARRAYID".R > "default.$PBS_ARRAYID.out" 2> "errorfile.$PBS_ARRAYID"
BTW, PBS _ARRAYID — это экспортируемая переменная среды, поэтому при необходимости к ней можно получить доступ в сценарии R с помощью Sys.getenv("PBS_ARRAYID")
. Вы можете использовать это, например, для создания имен входных и выходных файлов и для решений if/then/else, чтобы контролировать действия R-скрипта. Это лучше, чем иметь несколько слегка -разных версий одного и того же R-скрипта.
ПРИМЕЧАНИЕ. :Раньше я управлял кластерами HPC, работающими как с Torque, так и с Slurm,прошло около 8 лет с тех пор, как я это сделал. Все приведенные выше примеры написаны по памяти (и с помощью поиска qsub
справочных страниц в Интернете )и не тестировались на реальном кластере. Они могут (возможно, )потребуются некоторые изменения для работы, особенно последний пример с использованием $PBS _ARRAYID -они предлагаются в качестве грубых примеров того, как вы можете делать то, что хотите.