将 bash 变量传递给存储为单独 "commands.txt" 的命令列表
Pass bash variables to a list of commands stored as a separate "commands.txt"
我有以下 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
如何修改PBS脚本中的parallel
命令,使$start
和$n_jobs_procimg
传递给commands.txt?
在这种情况下,$start
应该是一个等于 24 的整数,$n_jobs_procimg
应该是一个等于 8 的整数。
这与我的问题无关,但对于上下文,process_img.py 脚本使用了一个多处理池,该池将处理核心的数量作为参数(--n_jobs
),我想根据我可用的处理核心总数来控制它。
我会将这两个常量存储在单独的脚本中:
constants.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
这样一来,您就可以随处使用它们,如果有更改,只需编辑一个文件。
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
我有以下 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
如何修改PBS脚本中的parallel
命令,使$start
和$n_jobs_procimg
传递给commands.txt?
在这种情况下,$start
应该是一个等于 24 的整数,$n_jobs_procimg
应该是一个等于 8 的整数。
这与我的问题无关,但对于上下文,process_img.py 脚本使用了一个多处理池,该池将处理核心的数量作为参数(--n_jobs
),我想根据我可用的处理核心总数来控制它。
我会将这两个常量存储在单独的脚本中:
constants.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
这样一来,您就可以随处使用它们,如果有更改,只需编辑一个文件。
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