8b681f70ea
The background-process poller for non-local backends ran `cat` on the whole log file every two seconds, then threw away everything except the part it had not seen yet. The offset it needed was already tracked one line below, so the full read was pure waste. Cost of one poll grew with the total output so far, which makes the cost of a run grow with the square of its length. A job writing 10 MB over an hour moved about 9 GB across the docker or SSH channel to deliver 10 MB of output. The poller now asks the shell for the file size and the bytes after the offset in one command. Reading the size first and cutting the tail at that same size keeps the two in step, so a file that grows mid-command never sends a byte twice. A file that shrank was rotated or truncated, so the offset drops back to 0 and the buffer is dropped. The output buffer is now appended to rather than replaced, matching the local reader loops, and the offset is counted in bytes because the shell counts bytes.