Sokszor előfordul, hogy egy program debug-olása közben több file is íródik. Jó lenne, ezeket egy képernyőn nézni, hogy ne árasszuk el nyitott ablakokkal a képernyőket. Pl. az Apache httpd2 két file-t ír a /var/log/apache2/ könyvtárba: access.log és error.log. Az első a file kéréseket, a második az esetleges hibákat tartalmazza. Ezeket kellene összefésülni. Lehetőleg bash-ban, hogy ne kelljen nagy C kódokat írogatni.
Némi borzolás után több helyen az exec használatát javasolta a kollektív tudat(alatti). Próbáljuk meg hát ezt az utat. Az exec-nek, ami normál körülmények között a jelenlegi process helyett betölt egy másikat programot és azt futtatja, van bash-ben egy különleges tulajdonsága. Filehandle-ket lehet nyitogatni vele, amit majdan a read -u paranccsal olvashatunk.
cd /var/log/apache2/
exec 5<access.log 6<error.log
while :; do
while read -u 5 inp; do echo "A:$inp"; done
while read -u 6 inp; do echo "E:$inp"; done
sleep 1;
done
Ez szuperül működik. Bonyolítsuk egy egészen picikét. Jó lenne a különböző file-okból érkező sorokat különböző színekkel kiírni. Próbálkoztam az ncurses könyvtárral, de a "tput setf red; tput setb green" nem működött rxvt (cygwin) alatt. De a direktebb megoldás megy.
echo -e "\e[31;42malma\e[m"
Egy piros "alma" szöveget kapunk, zöld háttérrel. A 30..37 a betű, 40..47 háttér. Sajnos nem egy RGB, de a semminél több. Ha esetleg 2 apache virtuális host-ot használunk (egy a 80-as, egy a 8080-as portra teszt környezet gyanánt), akkor a háttér színnel tudjuk megkülönböztetni a teszt környezet sorait.
Persze mondjuk időbélyeget is tehetünk elé, ha nincs a file-ban. Ezt mindenki oldja meg házi feladatként!
Ha zavar, hogy induláskor túl sok sort ír ki, akkor az elöző kódban a while elé beírhatjuk ezt:
while read -u 5 inp; do echo "A:$inp"; done | tail -n 10
while read -u 6 inp; do echo "E:$inp"; done | tail -n 10
Ez mind a két file-ból azt utolsó 10 sort fogja a képernyőre írni. Nem a legszebb megoldás, mert így feleslegesen elindít két process-t. Egy bash-t a while ciklusnak, hogy majd át lehessen az stdout-ját irányítani a tail-re. Ha egy for-ral olvasnánk egy 10 elemű tömbbe ciklikusan, akkor nem kellene ez a két process (azaz összesen 4). Ez is legyen házi feladat.
Mutatkozzunk minden nap!
+jegyzések