|
|
@@ -2,10 +2,11 @@
|
|
|
|
|
|
readonly DEFAULT_OUT_FMT="%s.out"
|
|
|
readonly CMD_FEED="$(mktemp -u /tmp/distributer-XXX.fifo)"
|
|
|
-readonly LOCK="$CMD_FEED.lock"
|
|
|
-readonly LOCK_TIMEOUT="1"
|
|
|
readonly PROC_BUFFER=10
|
|
|
readonly MAX_PROCS=$(expr $(ulimit -u) / 3 - $PROC_BUFFER)
|
|
|
+readonly MAX_CMD_SIZE=350
|
|
|
+readonly READER="$(dirname $(realpath $0))/fixed-read"
|
|
|
+readonly TIMEOUT=600 # 10 minutes
|
|
|
|
|
|
readonly CONF_LIST="$1"
|
|
|
readonly SERVER_LIST="$2"
|
|
|
@@ -40,18 +41,26 @@ clean_server() {
|
|
|
|
|
|
run_server() {
|
|
|
server="$1"
|
|
|
- loop="/tmp/$(basename $CMD_FEED .fifo)-$server.fifo"
|
|
|
+ loop="$(mktemp -u /tmp/$(basename $CMD_FEED .fifo)-$server-XXX.fifo)"
|
|
|
+ out_file=$(printf "$OUT_FMT" "$(basename "$loop" .fifo)")
|
|
|
mkfifo "$loop"
|
|
|
trap "clean_server $loop" 2 15
|
|
|
- while lockfile -$LOCK_TIMEOUT "$LOCK"; read cmd; do
|
|
|
- rm -f "$LOCK"
|
|
|
- cmd_sanitized="$(echo "$cmd" | sed "$S_SPACE;$R_DASH;$S_QUOTE")"
|
|
|
- out_file="$(printf "$OUT_FMT" "$cmd_sanitized")"
|
|
|
- printf "$server: $cmd\n" >&2
|
|
|
- printf "$cmd > $out_file\necho\n"
|
|
|
- read line < "$loop" > /dev/null # Block until command completes
|
|
|
- done | ssh -oBatchMode=yes -oStrictHostKeyChecking=no "$server" "sh" > "$loop"
|
|
|
- rm -f "$LOCK"
|
|
|
+ {
|
|
|
+ printf "echo > %s\necho\n" "$out_file"
|
|
|
+ # Block until command completes
|
|
|
+ while read -t $TIMEOUT line < "$loop" > /dev/null && \
|
|
|
+ cmd=$("$READER" $MAX_CMD_SIZE)
|
|
|
+ do
|
|
|
+ cmd=$(printf "%s" "$cmd" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
|
|
+ #cmd_sanitized="$(echo $cmd | sed "$S_SPACE;$R_DASH;$S_QUOTE")"
|
|
|
+ #out_file="$(printf "$OUT_FMT" $cmd_sanitized)"
|
|
|
+ printf "$server: %s\n" "$cmd" >&2
|
|
|
+ #printf "%s > %s\necho\n" "$cmd" "$out_file"
|
|
|
+ printf "printf \"%s: \" >> %s\n" "$cmd" "$out_file"
|
|
|
+ printf "%s >> %s\n" "$cmd" "$out_file"
|
|
|
+ printf "echo\n"
|
|
|
+ done
|
|
|
+ } | ssh -oBatchMode=yes -oStrictHostKeyChecking=no "$server" "sh" > "$loop"
|
|
|
clean_server "$loop"
|
|
|
echo "Server '$server' finished!" >&2
|
|
|
}
|
|
|
@@ -61,15 +70,14 @@ clean_up() {
|
|
|
pkill -P $pid
|
|
|
done
|
|
|
rm "$CMD_FEED"
|
|
|
- [ -e "$LOCK" ] && rm -f "$LOCK"
|
|
|
exit 2
|
|
|
}
|
|
|
|
|
|
main() {
|
|
|
mkfifo "$CMD_FEED"
|
|
|
trap clean_up 2 15
|
|
|
- cat "$CONF_LIST" | sed '/^[[:space:]]*$/d' > "$CMD_FEED" &
|
|
|
- pids=""
|
|
|
+ cat "$CONF_LIST" | sed '/^[[:space:]]*$/d' | \
|
|
|
+ xargs -d'\n' printf "%-$MAX_CMD_SIZE.${MAX_CMD_SIZE}s" > "$CMD_FEED" &
|
|
|
for server in $(head -n$MAX_PROCS "$SERVER_LIST"); do
|
|
|
run_server "$server" < "$CMD_FEED" > /dev/null &
|
|
|
done
|