Why is this tee losing stdout?
Solution 1:
Try this, an alternative way of doing the pipe that breaks:
#!/bin/bash
remote_ssh_account="depesz@localhost"
directory_to_tar=pgdata
nice tar cf - "$directory_to_tar" | \
tee >(
md5sum | \
ssh "$remote_ssh_account" 'cat > /tmp/h3po4-MD5-2012-03-13.sum'
) > >(
ssh "$remote_ssh_account" 'cat > /tmp/h3po4-data-2012-03-13.tar'
)
Solution 2:
Issue found. Here's the relevant portion of the strace
:
[pid 10243] write(1, "pFl\r\347\345]\244Hi\336\253,-\231\247\344\234\241\332\302\252\315\243G\234\225+\241\323\316s"..., 4096 <unfinished ...>
[pid 10247] select(7, [3 4], [3], NULL, {10, 0} <unfinished ...>
[pid 10243] <... write resumed> ) = -1 EAGAIN (Resource temporarily unavailable)
[pid 10247] <... select resumed> ) = 1 (out [3], left {10, 0})
[pid 10243] write(2, "tee: ", 5tee: <unfinished ...>
(...)
[pid 10243] write(2, "standard output", 15standard output <unfinished ...>
(...)
[pid 10243] write(2, ": Resource temporarily unavailab"..., 34: Resource temporarily unavailable) = 34
So, what's happening is that the remote ssh isn't yet ready for the write to continue. Most programs handle this correctly, but tee decides to die in a pile. See http://lists.freebsd.org/pipermail/freebsd-bugs/2012-February/047528.html for one reference to this sort of behavior. There are a couple others that I found too in a brief search for "EAGAIN tee".
The solution that lhunath found works because it effectively forces bash to handle the EAGAIN
. Elegant.