Это то, что я придумал. Мастер оболочки мог бы, вероятно, сделать лучше. Это решает все ваши недостатки?
У этого есть новые недостатки, над которыми я работаю. Флаги не могут иметь пробелов. Поэтому вы должны использовать их так: srun_wrap --ntasks=2 ls
или srun_wrap -n2 ls
.
Вызовы echo
и вызов функции в конце предназначены только для отладки.
#!/bin/bash
function srun_wrap {
i=1
for var in "$@"; do
# args starting with '-' up to the first that doesn't are srun
# flags. The rest of the args are the command
if [[ $var == -* ]]; then
flags=( "${flags[@]}" "$var" )
else
cmd="${@:$i}"
break
fi
i=$((i+1))
done
echo "flags = $flags"
echo "cmd = $cmd"
if [ "x$SLURM_JOB_ID" != "x" ]; then
# run in slurm
eval "srun ${flags[@]} ${cmd[@]}"
else
# run outside slurm
eval "${cmd[@]}"
fi
}
srun_wrap "$@"
Чтобы обойти проблему флагов, вы можете определить флаг самостоятельно (например, --cmd
или что-то в этом роде), который отделяет флаги srun от исполняемого файла.
srun_wrap --ntasks 2 --exclusive --cmd ls -alh
Или вы можете быть более явным, например sbatch, и создать флаг --wrap=<command>
, который вы анализируете сами. Вы должны были бы процитировать это, хотя.
srun_wrap --ntasks 2 --exclusive --wrap="ls -alh"
Единственный другой вариант - это создать собственный синтаксический анализатор, который может определять допустимые флаги srun. Это было бы много работы с возможностью ошибок.