2019-02-27 19:36:57 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
set -o errexit
|
|
|
|
set -o nounset
|
|
|
|
|
|
|
|
print_help()
|
|
|
|
{
|
|
|
|
echo "Usage: $prog [OPTION] ... -- COMMAND ... %INPUT% ..."
|
|
|
|
echo ""
|
|
|
|
echo "Run ..."
|
|
|
|
echo ""
|
|
|
|
echo " --help, -h display this help message"
|
|
|
|
echo " --jobs, -j num number of jobs (default: $jobs)"
|
|
|
|
echo " --input, -i file file with input data"
|
|
|
|
echo " --prefix, -p prefix prefix path for job directory (default: $prefix)"
|
|
|
|
echo " --jobname, -n name job name (default: $name)"
|
|
|
|
echo " --wrapper, -w wrapper exec wrapper (default: $wrapper)"
|
|
|
|
echo " --copy-from, -f copy command from direcotry (default: src)"
|
|
|
|
echo " --max-memory, -m mem max mem (default: $mem)"
|
|
|
|
echo " --max-time, -t timelimit (default: $timelimit)"
|
|
|
|
echo " --host, -s remote host (default: $host)"
|
|
|
|
echo " --srcdir, -d src for copying binary (default: $srcdir)"
|
|
|
|
echo " assumed to be remote, if it starts with a \":\""
|
|
|
|
echo ""
|
|
|
|
echo " COMMAND is the command that should be executed on the HPC cluster, where"
|
|
|
|
echo " %INPUT% will be replaced with a file containing the job-specific input data."
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mk_jobdir(){
|
|
|
|
echo "Creating temporary job directory in $workdir."
|
|
|
|
mkdir -p "$workdir"/bin
|
|
|
|
mkdir -p "$workdir"/cfg
|
|
|
|
mkdir -p "$workdir"/input
|
|
|
|
mkdir -p "$workdir"/output
|
|
|
|
mkdir -p "$workdir"/tmp
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
clean_jobdir(){
|
|
|
|
rm -rf "$workdir"
|
|
|
|
}
|
|
|
|
|
|
|
|
split_input(){
|
|
|
|
echo "Splitting input."
|
2019-05-23 07:58:55 +00:00
|
|
|
split --numeric-suffixes=1 -a 8 -e -n l/$jobs "$input" "$workdir/input/"
|
2019-02-27 19:36:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mk_hpc_script(){
|
|
|
|
local HOSTNAME=`hostname -f`
|
|
|
|
echo "Creating HPC script."
|
|
|
|
cat <<EOF > $workdir/job.sge
|
|
|
|
|
|
|
|
#!/bin/bash
|
|
|
|
## This script was generated by $prog (version: $version)
|
|
|
|
## on $timestamp
|
|
|
|
## by $USER@$HOSTNAME
|
|
|
|
## in $PWD
|
|
|
|
## using the following command:
|
|
|
|
## $invokation
|
|
|
|
##
|
|
|
|
## SGE configuration:
|
|
|
|
#$ -V
|
|
|
|
#$ -t 1-$jobs
|
|
|
|
#$ -l rmem=$mem
|
|
|
|
#$ -l h_rt=$timelimit
|
|
|
|
#$ -j yes
|
|
|
|
#$ -o "$prefix"/"$name"/output
|
|
|
|
|
|
|
|
|
|
|
|
set -o nounset
|
2019-05-23 07:58:55 +00:00
|
|
|
set -o errexit
|
2019-02-27 19:36:57 +00:00
|
|
|
set -x
|
|
|
|
|
2019-05-23 07:58:55 +00:00
|
|
|
export JOBINPUT="$prefix"/"$name"/input/\`printf %08d \$SGE_TASK_ID\`
|
|
|
|
|
|
|
|
/usr/bin/time -v $wrapper $prefix/$name/bin/$cmd
|
2019-02-27 19:36:57 +00:00
|
|
|
echo "Execution successful."
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mk_remote_jobdir(){
|
|
|
|
echo "Create remote working directory ($host:$prefix)."
|
|
|
|
ssh $host mkdir -p $prefix
|
|
|
|
}
|
|
|
|
|
|
|
|
install_hpc_script(){
|
|
|
|
echo "Installing HPC Script"
|
|
|
|
scp -q -r "$workdir" "$host":"$prefix"/"$name"
|
|
|
|
|
|
|
|
if [[ $srcdir == ":"* ]]; then
|
|
|
|
echo " Copying cmd from remote src."
|
|
|
|
ssh $host cp "${srcdir:1}"/"$srccmd" "$prefix"/"$name"/bin;
|
|
|
|
else
|
|
|
|
echo " Copying cmd from local src."
|
|
|
|
scp $srccmd "$srcdir"/"$srccmd" "$host":"$prefix"/"$name"/bin;
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
submit_job(){
|
|
|
|
echo "Submitting job."
|
|
|
|
ssh $host qsub "$prefix"/"$name"/job.sge
|
|
|
|
}
|
|
|
|
|
|
|
|
## global configuration
|
|
|
|
version="0.0"
|
|
|
|
prog=`echo $0 | sed 's|.*/||'`;
|
|
|
|
invokation="$prog $(printf "%q " "$@")"
|
|
|
|
timestamp=`date --utc --iso-8601=ns | sed -e 's/:/_/g' -e 's/,/./'`
|
|
|
|
host=`hostname`
|
|
|
|
workdir=`mktemp -d`
|
|
|
|
echo $workdir
|
|
|
|
|
|
|
|
## default values
|
2019-05-23 07:58:55 +00:00
|
|
|
prefix="\$HOME/hpc"
|
2019-02-27 19:36:57 +00:00
|
|
|
jobs=1
|
|
|
|
name="$host-$USER-$timestamp"
|
|
|
|
input=""
|
|
|
|
wrapper="singularity exec -B \$TMPDIR:$prefix/$name/tmp"
|
|
|
|
cmd=""
|
|
|
|
mem="2G"
|
|
|
|
timelimit="01:00:00"
|
|
|
|
local="false";
|
|
|
|
host="sharc.shef.ac.uk"
|
|
|
|
srcdir="."
|
|
|
|
|
|
|
|
while [ $# -gt 0 ]
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
--jobs|-j)
|
|
|
|
jobs="$2";
|
|
|
|
shift;;
|
|
|
|
--input|-i)
|
|
|
|
input="$2";
|
|
|
|
shift;;
|
|
|
|
--jobname|-n)
|
|
|
|
name="$2";
|
|
|
|
shift;;
|
|
|
|
--max-memory|-m)
|
|
|
|
mem="$2";
|
|
|
|
shift;;
|
|
|
|
--max-time|-t)
|
|
|
|
timelimit="$2";
|
|
|
|
shift;;
|
|
|
|
--host|-s)
|
|
|
|
host="$2";
|
|
|
|
shift;;
|
|
|
|
--srcdir|-d)
|
|
|
|
srcdir="$2";
|
|
|
|
shift;;
|
|
|
|
--wrapper|-w)
|
|
|
|
wrapper="$2";
|
|
|
|
shift;;
|
|
|
|
--prefix|-p)
|
|
|
|
prefix="$2";
|
|
|
|
shift;;
|
|
|
|
--help|-h)
|
|
|
|
print_help
|
|
|
|
exit 0;;
|
|
|
|
--) shift; break;;
|
|
|
|
*) print_help
|
|
|
|
exit 1;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
cmd=`echo $(printf "%q " "$@") | sed -e 's/%INPUT%/\$JOBINPUT/'`
|
|
|
|
cmdarray=("$@")
|
|
|
|
srccmd=${cmdarray[0]}
|
|
|
|
|
|
|
|
mk_jobdir;
|
|
|
|
|
|
|
|
if [ -n "$input" ]; then
|
|
|
|
if [ ! -f "$input" ]; then
|
|
|
|
echo "Input file \"$input\" not found!"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
split_input;
|
|
|
|
fi
|
|
|
|
|
|
|
|
mk_hpc_script;
|
|
|
|
|
|
|
|
mk_remote_jobdir;
|
|
|
|
|
|
|
|
install_hpc_script;
|
|
|
|
|
|
|
|
clean_jobdir;
|
|
|
|
|
|
|
|
submit_job;
|
|
|
|
|