Я хотел бы отправить симуляцию в несколько очередей в моем кластере.Как только одна очередь запустит ее, она будет отменена для остальных.Я понимаю, что это потенциально плохо определено, так как несколько заданий могут запускаться одновременно в нескольких очередях.
Вполне вероятно, что сценарий bash, отслеживающий очередь, мог бы сделать это.Можно ли сделать это напрямую с qsub при отправке задания?
РЕДАКТИРОВАТЬ: Ниже приведен рабочий пример, в котором используется скрипт bash.Это, вероятно, не оптимально, поскольку требует (медленного) доступа к диску.
#!/bin/bash -
#
# Exit in case of error
set -e
#
# Command-line argument is the name of the shared file
fid=$*
if [ -f ${HOME}/.dep_jobs/${fid} ]; then
echo "Given name already used, abort."
exit 1
else
echo "Initialize case."
touch ${HOME}/.dep_jobs/${fid}
fi
#
# Submit master job and retrieve the ID
echo "Submitting master job"
MID=$(qsub -l select=1:ncpus=1:mpiprocs=1 -q queue1 run.pbs)
echo ${MID##* }
#
# Add the ID to the shared file
ln -s ${HOME}/.dep_jobs/${fid} ${HOME}/.dep_jobs/${MID##* }
echo "M ${MID##* }" >> ${HOME}/.dep_jobs/${fid}
#
# Submit slave job and retrieve the ID
echo "Submitting slave job"
SID=$(qsub -l select=1:ncpus=1:mpiprocs=1 -q queue2 run.pbs)
echo ${SID##* }
#
# Add the ID to the shared file
ln -s ${HOME}/.dep_jobs/${fid} ${HOME}/.dep_jobs/${SID##* }
echo "S ${SID##* }" >> ${HOME}/.dep_jobs/${fid}
#
# Terminus, finalize case
echo "Finalize case"
echo "OK" >> ${HOME}/.dep_jobs/${fid}
И отправленный сценарий PBS должен начинаться следующим образом
#!/bin/bash
#PBS -S /bin/bash
#PBS -N Parallel
#
# Define shared file
shared_file=${HOME}/.dep_jobs/${PBS_JOBID}
#
# Read it until it finishes with "OK"
while [[ "$(more ${shared_file} | tail -n1)" != "OK" ]]; do
sleep 1
done
#
# Read master and slave job id
while read -r line
do
key=$(echo ${line} | awk '{print $1}')
if [ "$key" = "M" ]; then
MID=$(echo ${line} | awk '{print $2}')
elif [ "$key" = "S" ]; then
SID=$(echo ${line} | awk '{print $2}')
fi
done < ${shared_file}
#
# Current job is master or slave?
if [ ${PBS_JOBID} = ${MID} ]; then
key="M"
other="${SID}"
else
key="S"
other="${MID}"
fi
#
# Check the status of the other job
status="$(qstat ${other} | tail -n1 | awk '{print $5}')"
#
# I am running, if the other is in queue, qdel it
if [ "${status}" = "Q" ]; then
$(qdel ${other})
# If the other is running, we have race and only master survives
elif [ "${status}" = "R" ]; then
if [ "${key}" = "M" ]; then
$(qdel ${other})
else
exit
fi
else
echo "We should not be here"
exit
fi
#
# The simulation goes here