89 lines
2.6 KiB
Bash
Executable File
89 lines
2.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# This is a very simple job server which can be used to run commands in
|
|
# a different context. For example, for things that need to run from
|
|
# inside an OSX session rather than in the ssh-ed context.
|
|
|
|
here="$(cd $(dirname "$0"); pwd)"
|
|
pidfile="$here/pid"
|
|
|
|
unset LD_LIBRARY_PATH
|
|
|
|
###############################################################################
|
|
server() {
|
|
case "$serverstatus" in
|
|
( running ) echo "Server already running" 1>&2; exit 1 ;;
|
|
( stopped ) ;;
|
|
( dead ) echo "Cleaning up after dead server" 1>&2; rm -f "$pidfile" ;;
|
|
( * ) echo "Unknown server status" 1>&2; exit 1 ;;
|
|
esac
|
|
echo "Server started, pid=$$"
|
|
echo "$$" > "$pidfile"
|
|
trap cleanup 0 3 9 15
|
|
while true; do
|
|
cd "$here"
|
|
jobs="$(find * -name "*.job")"
|
|
if [[ "$jobs" = "" ]]; then sleep 2; continue; fi
|
|
echo "$jobs" | \
|
|
while read job; do
|
|
n="${job%.job}"
|
|
echo "Running job #$n..."
|
|
cd "$HOME"
|
|
. "$here/$job" > "$here/$n.out" 2>&1
|
|
echo "$?" > "$here/$n.ret"
|
|
cd "$here"
|
|
echo "Done"
|
|
rm -f "$here/$job"
|
|
done
|
|
done
|
|
}
|
|
|
|
cleanup() { rm -f "$pidfile"; }
|
|
|
|
###############################################################################
|
|
client() {
|
|
case "$serverstatus" in
|
|
( running ) ;;
|
|
( stopped ) echo "No server running" 1>&2; exit 1 ;;
|
|
( dead ) echo "Server died" 1>&2; exit 1 ;;
|
|
( * ) echo "Unknown server status" 1>&2; exit 1 ;;
|
|
esac
|
|
c="0"
|
|
if [[ -e "$here/counter" ]]; then c="$(cat "$here/counter")"; fi
|
|
c=$(( (c+1) % 10000 ))
|
|
echo "$c" > "$here/counter"
|
|
c="$here/$c"
|
|
echo "cd \"$(pwd)\"" > "$c.tmp"
|
|
if [[ "x$1" = "x-" ]]; then cat; else echo "$@"; fi >> "$c.tmp"
|
|
mv "$c.tmp" "$c.job"
|
|
while [[ -e "$c.job" ]]; do sleep 1; done
|
|
cat "$c.out"; rm -f "$c.out"
|
|
stat="$(cat "$c.ret")"; rm -f "$c.ret"
|
|
exit "$stat"
|
|
}
|
|
|
|
###############################################################################
|
|
status() {
|
|
echo "$serverstatus"
|
|
}
|
|
|
|
if [[ ! -e "$pidfile" ]]; then serverstatus="stopped"
|
|
else
|
|
pid="$(cat "$pidfile")"
|
|
if ps -p "$pid" | grep -q "$pid"; then serverstatus="running"
|
|
else serverstatus="dead"; fi
|
|
fi
|
|
|
|
###############################################################################
|
|
|
|
case "x$1" in
|
|
( "x--help" ) echo "--start: start server"
|
|
echo "--status: find the status of the running server, if any"
|
|
echo "Anything else, run it on the server; use \`-' to read"
|
|
echo " shell code from stdin"
|
|
exit ;;
|
|
( "x--start" ) shift; server "$@" ;;
|
|
( "x--status" ) shift; status "$@" ;;
|
|
( * ) client "$@" ;;
|
|
esac
|