Toon posts:

[bash] pipe naar verschillende programma's

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik weet dat het mogelijk is om stderr naar een pipe te sturen:

programma 2>&1 | ander

ook alleen stderr naar een pipe sturen is mogelijk:

programma 2>&1 1>&- | ander

Maar is het ook mogelijk om stdout en stderr naar verschillende programma's te sturen?

Dus zoiets:
programma 1| ander-out 2| ander-err
(bovenstaande werkt niet dus)

Ik wil dit doen om in een backup programma de output van tar -v (alle bestanden die naar tape geschreven worden) van een timestamp te voorzien en naar een database te schrijven, terwijl ik hetzelfde wil doen met de foutmeldingen, maar die moeten naar een andere tabel. Nu gebruik ik hier named pipes (fifo) voor, maar daar blijkt dat de programma's die de logregels "oppakken" en naar de database schrijven, bij het afsluiten van tar alle logregels / files in een keer krijgen. Alle logregels en files krijgen dus als timestamp het moment dat de backup stopt...

Ik heb ook met wat voorbeelden van Internet geprobeerd een C-programma te schrijven, maar ik ben geen C-held (leuke woordspeling trouwens), en bovendien, dat zou betekenen dat er nóg een extra taal toegevoegd zou worden aan het programma. (Naast Bash, PHP, SQL en HTML).

Tenslotte dit is op een linux-machine met kernel 2.2.18.

  • Red Sonja
  • Registratie: Juli 2001
  • Laatst online: 03-05 19:27

Red Sonja

Linux: power to de wortel

Tja, je zou eerst naar een bestand kunnen schrijven en dat weer uitlezen(prog 2> /tmp/file | ander-out; ander-err < /tmp/file) ? Het zal vast wel mogelijk zijn maar, weet het zo 1,2,3 ook ni... ben benieuwd :7

And the beast shall be made legion. Its numbers shall be increased a thousand thousand fold. The din of a million keyboards like unto a great storm shall cover the earth, and the followers of Mammon shall tremble. from The Book of Mozilla, 3:31


Verwijderd

Het verschil met pipes en files is dat in het eerste geval er pas een EOF wordt gegeven als de bron de pipe sluit maar met files gebeurd dat al als het einde van de file bereikt wordt. Dit zou een probleem kunnen zijn.

[ Voor 9% gewijzigd door Verwijderd op 17-05-2003 12:11 ]


  • Emmeau
  • Registratie: Mei 2003
  • Niet online

Emmeau

All your UNIX are belong to us

kijk eens naar tee

man tee

The tee utility copies standard input to standard output, making a copy
in zero or more files. The output is unbuffered.

If you choose to criticise you choose your enemies


Verwijderd

Topicstarter
Tja, je zou eerst naar een bestand kunnen schrijven en dat weer uitlezen(prog 2> /tmp/file | ander-out; ander-err < /tmp/file) ? Het zal vast wel mogelijk zijn maar, weet het zo 1,2,3 ook ni... ben benieuwd
Maar dan zit ik met het probleem dat ander-err pas uitgevoerd wordt als de eerste klaar is, en dus weer de timestamp van het einde van de backup krijgt.
Het verschil met pipes en files is dat in het eerste geval er pas een EOF wordt gegeven als de bron de pipe sluit maar met files gebeurd dat al als het einde van de file bereikt wordt. Dit zou een probleem kunnen zijn.
Die begrijp ik niet helemaal, wat bedoel je met "gebeurd dat al als het einde van de file bereikt wordt"? Hoe weet de shell dat het einde van de file bereikt is, als ik er geen EOF naar stuur?
kijk eens naar tee

man tee

The tee utility copies standard input to standard output, making a copy
in zero or more files. The output is unbuffered.
Heb ik ook wat mee lopen experimenteren, maar daar heb ik hetzelfde probleem, ik kan maar één van de twee (stdout/stderr) door tee heen sturen.

  • Thijsch
  • Registratie: Februari 2002
  • Laatst online: 01-01 18:43
mkfifo good
mkfifo bad

progseltje 1> good 2> bad &
prog2 < good
prog3 < bad

dit zou toch moeten werken? en let op de &, dan wordt het zo goed als gelijktijdig uitgevoerd.

[ Voor 30% gewijzigd door Thijsch op 18-05-2003 09:49 ]


  • mvdejong
  • Registratie: Juni 2000
  • Laatst online: 29-11-2024

mvdejong

When does the hurting stop ?

( commando | stdout-processor ) 2>&1 | stderr-processor

The number of things that Arthur couldn't believe he was seeing was fairly large


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

P&W -> NOS

Verwijderd

Topicstarter
Naar aanleiding van bovenstaande posts ben ik nog wat aan het experimenteren geslagen; en wat bleek? Het probleem zat hem niet in de named pipes, maar in een tr die ik deed in het programma dat de logfiles "opvangt" en voorzien van timestamp naar de MySQL database schrijft. (Die tr staat er in om eventuele quotes and backquotes te verwijderen, voordat MySQL zich er in verslikt...)

ik heb dus
code:
1
2
3
4
5
6
7
cat ${path}/fifo/log | tr -d \'\` | while read message
        do
                date=`date +%Y%m%d`
                time=`date +%X`
                echo "INSERT INTO log VALUES(0,'"$date"','"$time"','"$message"')
;" >> ${tmp}backuplog.sql
        done

Gewijzigd in:
code:
1
2
3
4
5
6
7
8
cat ${path}/fifo/log | while read message
        do
                date=`date +%Y%m%d`
                time=`date +%X`
                message=`echo $message | tr -d "[:cntrl:]\047\140"`
                echo "INSERT INTO log VALUES(0,'"${date}"','"${time}"','"${message}"')
;" >> ${tmp}backuplog.sql
        done


En nu lijkt het goed te gaan...

(zoals je ziet heb ik ook nog even wat dingetjes een beetje netter gemaakt, zoals de { } om de variabelen en \047 ipv ' en \140 ipv ` en de [:cntrl:] toegevoegd...)

[ Voor 18% gewijzigd door Verwijderd op 18-05-2003 20:52 . Reden: info added ]

Pagina: 1