Как создать разные сценарии для запуска в каждом каталоге в Linux?

У меня есть каталог main, в котором около 100 каталогов. Например, это выглядит так:

main
 |__ test_1to50000
 |__ test_50001to60000
 |__ test_60001to70000
 |__ test_70001to80000
 |__ test1.sh

У меня есть скрипт sbatch test1.sh для запуска в первом каталоге.

#!/bin/bash

#SBATCH --job-name=sbatchJob   
#SBATCH --cpus-per-task=16       
#SBATCH --mem-per-cpu=8G    
#SBATCH --time=1-00:00:00
#SBATCH --qos=1day
if [ -f ~/.bashrc ] ; then
    . ~/.bashrc
fi

module load Perl/5.28.0-GCCcore-8.2.0

perl path/to/software --cpu 16 --run /path/to/test_1to50000 command /path/to/test_1to50000/software.`date +"%m_%d_%y_%H-%M-%S"`.log

У меня есть 100 каталогов, поэтому я хотел бы создать каждый скрипт для каждого каталога и отправить скрипты. Как сгенерировать sbatch scripts для всех остальных каталогов, как указано выше?


person beginner    schedule 14.11.2020    source источник
comment
Вы можете найти помощь в Передача аргументов командной строки через sbatch. В худшем случае вы можете запустить какой-либо вариант for dir in *; do sed "s%@dir@%$dir%g" template.file > sbatch.$dir; done для создания сценариев из файла шаблона, который содержит @dir@ маркеров, в которые вы хотите поместить имя (под)каталога. Использование % вместо / в команде sed работает лучше, если вам нужно работать с путями — до тех пор, пока вы не используете % нигде в именах файлов или каталогов.   -  person Jonathan Leffler    schedule 14.11.2020
comment
В руководстве sbatch указано, что аргументы могут быть предоставлены sbatch. Вы должны иметь возможность создать один файл, а затем вызвать его с соответствующими аргументами: for dir in *; do sbatch … $dir; done. Я не исследовал детали или предостережения, но это было бы нормальным способом работы систем Unix (POSIX, Linux, …).   -  person Jonathan Leffler    schedule 14.11.2020
comment
@JonathanLeffler спасибо за комментарий. Да, я могу создавать сценарии для каждого каталога, но внутри сценариев я также должен изменить имена каталогов, и это нужно сделать для каждого сценария. Например, в приведенном выше скрипте sbatch test1.sh команда в конце также имеет путь к каталогу. Итак, как это сделать?   -  person beginner    schedule 14.11.2020


Ответы (1)


Лучше всего использовать массив заданий со следующим скриптом:

#!/bin/bash
#SBATCH --array=0-3   # 3 == number of dirs - 1
#SBATCH --job-name=sbatchJob   
#SBATCH --cpus-per-task=16       
#SBATCH --mem-per-cpu=8G    
#SBATCH --time=1-00:00:00
#SBATCH --qos=1day
if [ -f ~/.bashrc ] ; then
    . ~/.bashrc
fi

module load Perl/5.28.0-GCCcore-8.2.0
DIRS=(main/*/)    # This array will hold all directories
CURRDIR="${DIRS[$SLURM_ARRAY_TASK_ID]}" # This is the directory taken care of by the current job

perl path/to/software --cpu 16 --run "$CURRDIR" command "$CURRDIR"/software.`date +"%m_%d_%y_%H-%M-%S"`.log

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

person damienfrancois    schedule 15.11.2020