Perché questo tee sta perdendo lo stdout?

Script semplice:

#!/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' 

Teoricamente dovrebbe fornire i dati e il checksum, a macchina remota.

  • Come "cd" alla directory non utf8
  • Inoltro port SSH con un canale master
  • Accesso ad un host Linux a Active Directory incustodito
  • Come configurare un server linux redhat / centos / amazon per le connessioni tcp aperte da 1million?
  • Come filtrare i processi di sistema predefiniti con ps?
  • Cambiare la shell (utilizzando chsh) tramite la row di command in uno script
  • Ma in qualche modo il tee fallisce con:

     tee: standard output: Resource temporarily unavailable 

    Ha strace, ma nulla è venuto fuori di esso. Vedo sia ssh iniziato che scrittura a entrambi, ma solo il pipe a (md5sum | ssh) ottiene dati – strace dei dati "ssh" non ottiene alcun dato e dopo 5 secondi il tee mostra l'errore.

    Oltre a questo tutto funziona. Sono stabilite 2 connessioni, i lavori di tar, md5sum e le sue opere di consegna.

  • Come utilizzare un file .bashrc personalizzato nel login SSH
  • Recuperare uno script in esecuzione da una session terminal
  • 2 Solutions collect form web for “Perché questo tee sta perdendo lo stdout?”

    Prova questo, un modo alternativo di fare il pipe che si rompe:

     #!/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' ) 

    Numero trovato. Ecco la parte rilevante della 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 

    Quindi, ciò che succede è che il ssh remoto non è ancora pronto per la scrittura per continuare. Molti programmi gestiscono questo correttamente, ma il tee decide di morire in un mucchio. Vedere http://lists.freebsd.org/pipermail/freebsd-bugs/2012-February/047528.html per un riferimento a questo tipo di comportmento. Ci sono un paio di altre che ho trovato troppo in una breve ricerca per "tee EAGAIN".

    La soluzione che il lhunath ha trovato funziona perché efficace forza bash per gestire l' EAGAIN . Elegante.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.