From 871aa6a67af12930d97861f99080fd470250bdd0 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Fri, 27 May 2011 18:05:24 +0100 Subject: [PATCH] BUG: wmakeSchedulerUptime: uptime invocation --- wmake/wmakeSchedulerUptime | 255 +++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 wmake/wmakeSchedulerUptime diff --git a/wmake/wmakeSchedulerUptime b/wmake/wmakeSchedulerUptime new file mode 100644 index 00000000000..94b6735fe9e --- /dev/null +++ b/wmake/wmakeSchedulerUptime @@ -0,0 +1,255 @@ +#!/bin/bash +#------------------------------------------------------------------------------ +# ========= | +# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox +# \\ / O peration | +# \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. +# \\/ M anipulation | +#------------------------------------------------------------------------------- +# License +# This file is part of OpenFOAM. +# +# OpenFOAM is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. +# +# Script +# wmakeSchedulerUptime +# +# Description +# Scheduler for network distributed compilations using wmake. +# - WM_HOSTS contains a list of hosts and number of concurrent processes +# eg, +# export WM_HOSTS="hostA:1 hostB:2 hostC:1" +# - WM_COLOURS contains a list of colours to cycle through +# export WM_COLOURS="black blue green cyan red magenta yellow" +# +# Sources the relevant cshrc/bashrc if not set. +# +# WM_PROJECT_DIR, WM_PROJECT and WM_PROJECT_VERSION will have been set +# before calling this routine. +# FOAM_INST_DIR may possibly have been set (to find installation) +# +# Usage +# wmakeSchedulerUptime COMMAND +# run 'COMMAND' on one of the slots listed in WM_HOSTS +# +# wmakeScheduler -count +# count the total number of slots available in WM_HOSTS +# eg, export WM_NCOMPPROCS=$(wmakeScheduler -count) +# +#------------------------------------------------------------------------------- + +# csh sets HOST, bash sets HOSTNAME +: ${HOST:=$HOSTNAME} + + +lockDir=$HOME/.$WM_PROJECT/.wmake +# fallback - 1 core on current host +: ${WM_HOSTS:=$HOST:1} + +# count the total number of slots available and exit +if [ "$1" = "-count" ] +then + expr $( + for slotGroup in $WM_HOSTS + do + n=${slotGroup##*:} + [ "$n" = "${slotGroup%%:*}" ] && n=1 # missing ':' + echo "+ ${n:-1}" + done + ) + exit 0 +fi + +# where to source WM_PROJECT settings in a remote shell +# This code tries to figure out which cshrc or bashrc to execute. +# !! Assumes remote computer running same shell and startup files +# in same location + +sourceFoam=false # fallback command +case $SHELL in +*/csh | */tcsh ) # [t]csh vs bash|ksh|sh + shellRc=cshrc + ;; +*) + shellRc=bashrc + ;; +esac + +# check ~/.$WM_PROJECT/$WM_PROJECT_VERSION/ +# check ~/.$WM_PROJECT/ +# check <installedProject>/etc/ +if [ "$WM_PROJECT" ] +then + for i in \ + $HOME/.$WM_PROJECT/$WM_PROJECT_VERSION \ + $HOME/.$WM_PROJECT \ + $WM_PROJECT_DIR/etc \ + ; + do + if [ -f "$i/$shellRc" ] + then + sourceFoam="$i/$shellRc" + break + fi + done +fi + +# Construct test string for remote execution. +# Source WM_PROJECT settings if WM_PROJECT environment not set. +# attempt to preserve the installation directory 'FOAM_INST_DIR' +# use FOAM_SETTINGS to pass command-line settings +case $sourceFoam in +*/bashrc) + if [ "$FOAM_INST_DIR" ] + then + sourceFoam='[ "$WM_PROJECT" ] || '"FOAM_INST_DIR=$FOAM_INST_DIR . $sourceFoam $FOAM_SETTINGS" + else + sourceFoam='[ "$WM_PROJECT" ] || '". $sourceFoam $FOAM_SETTINGS" + fi + ;; + +*/cshrc) + # TODO: csh equivalent to bash code (preserving FOAM_INST_DIR) + sourceFoam='if ( ! $?WM_PROJECT ) source '"$sourceFoam $FOAM_SETTINGS" + ;; +esac + +# quote double-quotes for remote command line +rcmd=$(echo $* | sed -e s/\"/\'\"\'/g) +## the same, without forking (not ksh, maybe not /bin/sh either) +# rcmd=$(while [ "$#" -gt 0 ]; do echo "${1//\"/'\"'}"; shift; done) + + +# Convert WM_COLOURS into an array +declare colourList +nColours=0 +for col in $WM_COLOURS +do + colourList[$nColours]=$col + ((nColours = $nColours + 1)) +done + +# Bashism: make pipe fail early. +# This ensures the return value of the command is returned and not of the +# colouring pipe etc. +set -o pipefail + + +# +# colour output by argument 1 +# +colourPipe() +{ + if [ "$1" ] + then + ( + while read line + do + setterm -foreground $1 + echo "$line" + done + setterm -foreground default + ) + else + cat + fi +} + + + +# parse options +nprocs=1 +while [ "$#" -gt 0 ] +do + case "$1" in + -np) + shift + nprocs=$1 + shift + ;; + -*) + usage "unknown option: '$*'" + ;; + *) + break + ;; + esac +done + + +colourIndex=0 + +while : +do + for slotGroup in $WM_HOSTS + do + # split 'host:N', but catch 'host:' and 'host' too + host=${slotGroup%%:*} + n=${slotGroup##*:} + [ "$n" = "$host" ] && n=1 # missing ':' + : ${n:=1} + + + # Determine load + if [ "$host" = "$HOST" ]; then + stat=`uptime` + else + stat=`ssh $host uptime` + fi + load=`echo "$stat" | sed -e 's/.*average:[^0-9.]*\([0-9.]*\).*/\1/'` + + + #echo "Machine:$host load:$load allowed:$WM_NCOMPPROCS nprocs:$nprocs" + + + # Check if adding nprocs to load causes overload + if (echo '' | awk "{if ($load + $nprocs > $WM_NCOMPPROCS) {exit 1}}") + then + if [ "$nColours" -gt 0 ] + then + # Set colour + colour="${colourList[$colourIndex]}" + echo "Machine:$host Starting:$*" + + if [ "$host" = "$HOST" ]; then + eval $* 2>&1 | colourPipe "$colour" + else + ssh $host "$sourceFoam 2>/dev/null; cd $PWD && $rcmd" 2>&1 | colourPipe "$colour" + fi + retval=$? + else + echo "Machine:$host Starting:$*" + if [ "$host" = "$HOST" ]; then + eval $* 2>&1 + else + ssh $host "$sourceFoam 2>/dev/null; cd $PWD && $rcmd" 2>&1 + fi + retval=$? + fi + exit $retval + fi + + + # Cycle through colours. Note: outside lock clause! + colourIndex=$(expr $colourIndex + 1) + [ "$colourIndex" -lt "$nColours" ] || colourIndex=0 + + done + + # Did not find any free machines. Rest a bit. + #echo "Too much load. Waiting" + sleep 1 +done + +#------------------------------------------------------------------------------ -- GitLab