AIX at its best - xargs echo

Post date: Sep 19, 2012 8:09:09 PM

Ma két apró bugot találtam az AIX-ben. Az egyik alighanem fel se tűnt volna, ha nem használnám egy KSH profile-ban: AIX 6.1 TL7-től bekerült egy szóköz a 'ps -p $PPID -o tty=' parancs kimenetének a legelejére. Ez amúgy arra kell nekem, hogy sudo használata esetén meg lehessen állapítani, ki volt a kezdeti user, és eszerint külön history file-okat lehessen létrehozni. Máskülönben roppant idegesítő egyidejűleg másokkal osztozni a history-n.

A másikon hosszú ideig dolgoztam, mert nem voltam benne biztos, hogy nem én rontom-e el: egy többszáz soros egyszerű szövegfile-ból awk-val kiemeltem a második oszlopot, majd az egészet xargs-zal akartam összefűzni egy sorba (amíg egy ilyet más eszközökkel összerakok, lemegy a Nap...).

Azt láttam, hogy a kimenetben van egy sortörés, holott az elvárt eredmény egyetlen folytonos sor lett volna. Az input file tiszta volt. [1] Ha egy pipe-ban továbbadtam a kimenetet, előbukkant egy warning:

xargs: The /usr/bin/echo command terminated by signal SIGPIPE.

Ilyenkor kell az "AIX strace", a truss. Ezt az érdekes részletet találtam:

execve("/usr/bin/echo", 0x20002160, 0x2FF22B70)  argc: 1024

Hát itt biztosan nem ennyi argumentum szerepel, hanem több. Utánanézve kiderült, hogy az operációs rendszer korlátai jóval magasabban vannak, viszont az xargs-nak meg lehet adni a maximális argumentumszámot ("-n" flag). Próbáljuk ki!

$ awk '{print $2}' lg_servers_nic.txt | xargs -n 2048

Legalább a sortörés eltűnt, de valami szemét került a kimenet legelejére. A truss szerint az előbbi argc (argument count) már 1091. Itt jól látszanak a hulladék karakterek is. (truss -adif, az első oszlop a PPID, a második a child PID)

14024828:       39846097: 0.0627:        execve("/usr/bin/echo", 0x20002160, 0x2FF22B68)  argc: 1091
14024828:       39846097:  argv:   QM-5    M-R       R
    RE    Q    RM-^P   M-^Y   M-;     RM-t     /  S9   
14024828:       39846097:  SU  d    # xxx.xx.xx.xx 255.255.252.0 up eth # xxx.xx.xx.xx

Kísérleti úton megállapítottam, hogy "-n 1029"-től kezd el megjelenni a szemét, a sortörés viszont ottmarad, majd "-n 1090"-től eltűnik.

Na de ki a hülye? A lényeg, hogy egy naprakész 7.1-es rendszeren a hiba nem jelentkezik, ha 'xargs -n 2048'-at használok (anélkül a sor továbbra is törik), tehát a probléma csak a 6.1-et érinti (6.1 TL5 és TL7 biztosan érintett)! Mehet a Service Request az IBM-nek...

[1] Egy Linuxon is megnéztem ezen a ponton, és ott a sima xargs is rögtön a helyes kimenetet adta.