Linux

為什麼這個 tee 失去了標準輸出?

  • March 14, 2012

簡單的腳本:

#!/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. 優雅的。

引用自:https://serverfault.com/questions/369757