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.

  • Le migliori pratiche per evitare l'errore di Jenkins: sudo: nessun tty presente e nessun programma di askpass specificato
  • Gli utenti ordinari sono in grado di leggere / etc / passwd, è questo un buco di sicurezza?
  • Come disabilitare tutta la gestione dell'alimentazione in Ubuntu (per un netbook server)?
  • Mettendo / etc sotto il controllo sorgente
  • scelta dell'interface di networking basata sullo scopo della networking
  • Impostazioni Readahead per LVM, dispositivo-mapper, software Raid e blocchi di dispositivi - cosa vince?
  • 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.