Linux
為什麼這個 tee 失去了標準輸出?
簡單的腳本:
#!/bin/bash remote_ssh_account="depesz@localhost" directory_to_tar=pgdata exec nice tar cf - "$directory_to_tar" | \ tee >( md5sum - | \ ssh "$remote_ssh_account" 'cat - > /tmp/h3po4-MD5-2012-03-13.tar' ) | \ ssh "$remote_ssh_account" 'cat - > /tmp/h3po4-data-2012-03-13.tar'
理論上它應該將數據和校驗和傳送到遠端機器。
但不知何故,發球檯失敗了:
tee: standard output: Resource temporarily unavailable
做了 strace,但沒有任何結果。我看到兩個 ssh 都啟動了,並且 tee 都向它們寫入,但只有到 ( md5sum | ssh ) 的管道獲取數據 - ssh“數據”的 strace 沒有獲取任何數據,並且 5 秒後 tee 顯示錯誤。
除此之外,所有工作。2 個連接建立,tar 工作,md5sum 及其傳遞工作。
試試這個,另一種做管道破裂的方法:
#!/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' )
發現問題。這是 的相關部分
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
所以,發生的事情是遠端 ssh 還沒有準備好繼續寫入。大多數程序都能正確處理這個問題,但 tee 決定死在一堆。有關此類行為的參考,請參見http://lists.freebsd.org/pipermail/freebsd-bugs/2012-February/047528.html 。在對“EAGAIN tee”的簡短搜尋中,我也發現了其他幾個。
lhunath 找到的解決方案有效,因為它有效地強制 bash 處理
EAGAIN
. 優雅的。