考慮以下情形:防止FIFO關閉FIFO
一個FIFO命名創建test
。在一個終端窗口(A)中運行cat <test
,並在另一個終端窗口(B)中運行cat >test
。現在可以在窗口B中寫入並在窗口A中獲取輸出。也可以終止進程A並重新啓動它,並仍然可以按照懷疑使用此設置。但是,如果您在窗口B中終止進程,那麼B(就我所知)將通過FIFO發送EOF來處理A並終止該進程。實際上,如果您運行的流程不會在EOF上終止,您仍然無法使用您重定向到流程的FIFO。我認爲這是因爲這個FIFO被認爲是關閉的。
有沒有辦法解決這個問題?
爲什麼我遇到這個問題的原因是因爲我想發送命令到在屏幕會話中運行的我的Minecraft服務器。例如:echo "command" >FIFO_to_server
。這可能是通過自己使用屏幕來完成的,但我對屏幕不太舒服,我認爲只使用管道的解決方案會更簡單和更清晰。
不幸的是,'tail'等待EOF,因此它不會逐行傳遞管道中的內容。 – pabouk 2013-08-22 16:42:34
@pabouk感謝您指出這個錯誤:'tail -n 1 -f'會跳過在它啓動之前可用的輸入或使其可用的速度超過其可讀的速度。我打算寫'tail -n +1 -f',它馬上開始輸出。 – Gilles 2013-08-22 17:03:55
謝謝。我曾嘗試過,但'-n + 1'沒有按預期工作。現在,您已確認這是正確的方式,我進一步檢查了問題,並意識到問題出現在「tail」標準輸出的塊緩衝(而不是默認行緩衝)中。逐行管道的解決方案:'stdbuf -oL tail -n +1 -f client_pipe |命令' – pabouk 2013-08-22 17:55:41