Передайте bash переменных в список команд, хранящийся как отдельный файл "commands.txt". - PullRequest
1 голос
/ 27 мая 2020

У меня есть следующий сценарий PBS:

#!/bin/bash -l
#PBS -l walltime=12:00:00,nodes=1:ppn=24,pmem=2580mb

((start=24))
((n_jobs_procimg=8))

cd $PBS_O_WORKDIR
conda activate msi_sip_37

module load parallel
parallel -u -j 3 < commands.txt
wait

А содержимое commands.txt:

python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+0 --idx_max $start+8
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+8 --idx_max $start+16
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+16 --idx_max $start+24

Я [неправильно] ожидаю, что $start и $n_jobs_procimg должен быть доступен для команд в commands.txt , но когда я запускаю это задание, я получаю следующую ошибку для каждой команды в commands.txt :

usage: process_img.py [-h] [-n N_JOBS] [-m MSI_TEST] [-i IDX_MIN] [-d IDX_MAX]
process_img.py: error: argument -n/--n_jobs: expected one argument

Как изменить команду parallel в сценарии PBS, чтобы $start и $n_jobs_procimg передавались в commands.txt ?

In В этом случае $start должно быть целым числом, равным 24, а $n_jobs_procimg должно быть целым числом, равным 8.

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

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

export переменные:

#!/bin/bash -l
#PBS -l walltime=12:00:00,nodes=1:ppn=24,pmem=2580mb

start=24
n_jobs_procimg=8
export start
export n_jobs_procimg

cd $PBS_O_WORKDIR
conda activate msi_sip_37

module load parallel
parallel -u -j 3 < commands.txt
0 голосов
/ 27 мая 2020

Я бы сохранил две константы в отдельном скрипте:

константы. sh:

((start=24))
((n_jobs_procimg=8)

Затем используйте источник:

#!/bin/bash -l
#PBS -l walltime=12:00:00,nodes=1:ppn=24,pmem=2580mb

source constants.sh

cd $PBS_O_WORKDIR
conda activate msi_sip_37

module load parallel
parallel -u -j 3 < commands.txt
wait

А затем используйте файл commands.txt, чтобы включить его:

source constants.sh
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+0 --idx_max $start+8
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+8 --idx_max $start+16
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+16 --idx_max $start+24

Таким образом, они будут доступны везде, и вам нужно будет отредактировать только один файл, если есть изменения.

...