Hol a hiba a képen?

ps -o pid,ppid,user,group,etime,tty,priority,nice,time,state,vsize,pcpu,pmem,wchan,args
-p 36372540
     PID     PPID     USER    GROUP     ELAPSED     TT PRI NI        TIME ST   VSZ  %CPU  %MEM    WCHAN COMMAND
36372540 55574702                                       60 20    00:00:00 Z                             <defunct>

Annyit segítek, hogy ezt AIX-on sikerült előadni, Linuxon ilyen:

ps -o pid,ppid,user,group,etime,tty,priority,nice,time,state,vsize,pcpu,pmem,wchan,args -p 6881
  PID  PPID USER     GROUP        ELAPSED TT       PRI  NI     TIME S    VSZ %CPU %MEM WCHAN  COMMAND
 6881  6880 projects devel          00:19 pts/3     20   0 00:00:00 Z      0  0.0  0.0 -      [cronolog.sh] <defunct>

Hozzászólások

Szerkesztve: 2022. 12. 06., k – 10:39

Mellékszál: bizonyos helyzetben a központi statiszikai shell egy zombi-processzt hagy nekem hátra, de olyan ügyes módon, hogy a szülő a wait helyett egy execve-t hajt végre, így a zombi szülője egy ártatlan harmadik program lesz. Így lehet reprodukálni:

fun () {
    printf '%s Foprogram indul\n' "$(date +%Y%m%d.%H%M%S)"
    sleep 30
    printf '%s Foprogram vege\n' "$(date +%Y%m%d.%H%M%S)"
}
(fun & echo $! >cronlog.pid) 2>&1 | /usr/local/bin/cronolog cronlog_test_%Y%m%d.log &

CURRENT_YEAR-ben, normal rendszeren (<32MB RAM-mal rendelkezo beagyazott eszkozoket kiveve) mi ertelme van bash helyett mast hasznalni? Eroforrasban nincs akkora kulonbseg, szivasban meg lehet.

A strange game. The only winning move is not to play. How about a nice game of chess?

Hát a `dash`-nak például van niche-e: vele lehet a hordozható scripteket írni, mivel az volt a fejlesztésének a célja, hogy semmilyen plusz ne legyen benne, csak az, amit a Posix kifejezetten előír. Például a °printf` a dash-ban \xHH szekvenciát nem kezel, csak \OOO szekvenciát.

Sajnos a ksh eszén nem lehet túljárni ilyen trükkökkel...

Gondnak meg több okból is gond, pl.: a felesleges sorok a 'ps x' kimenetében elvonhatják a figyelmet a valós problémákról; a processzek száma limitált lehet, hogy pl.:

/usr/sbin/lsattr -E -l sys0 | grep maxuproc
maxuproc 128 Maximum number of PROCESSES allowed per user True
Szerkesztve: 2022. 12. 06., k – 11:49

Na szóval a gond ott lenne, hogy én programból dolgoznám fel a 'ps' kimenetét, szóközzel elválasztott részeket keresve. Nem valami tudományos módszer, de az AIX-os zombi processznél különösen nem sikerül, mivel annál hét mező értéke üresen marad.

Speciel nekem az is elég lenne, ha a USER, GROUP, ELAPSED stb mezők helyére odacsapná, hogy 'to-save-memory-I-have-destroyed-this-bit-of-information'

Szerk: Vagy lenne egy POSIX-szabványosított `ps` rendszerhívás, amivel ezeket az információkat be lehet szerezni. (Hangos derültség a karzaton.)

Nagyon elegánsan és egyszerűen lehet ezt is kezelni, pl.:

    harap (&bln, (BuffData *)&bpid,  (BuffData *)&bln, ' '); /* ps -o pid */
    harap (&bln, (BuffData *)&bppid, (BuffData *)&bsave, ' '); /* ps -o ppid */
    bln= bsave;
    harap (&bln, (BuffData *)&busr,  (BuffData *)&bln, ' '); /* ps -o user */
    harap (&bln, (BuffData *)&bgrp,  (BuffData *)&bln, ' '); /* ps -o group */
    harap (&bln, (BuffData *)&belt,  (BuffData *)&bln, ' '); /* ps -o etime */
    harap (&bln, (BuffData *)&btty,  (BuffData *)&bln, ' '); /* ps -o tty */
#if defined(_AIX)
    {
        ConstBuffData bdiff;
        bdiff.ptr= bppid.ptr + bppid.len;
        bdiff.len= busr.ptr  - bdiff.ptr;
        if (bdiff.len>=38) { /* feltesszuk, hogy ez egy zombi, es 'user','group','etime','tty' ures */
            busr.len= 0;
            bgrp.len= 0;
            belt.len= 0;
            btty.len= 0;
            bln= bsave;
        }
    }
#endif

Még azt említsük meg, hogy a cronolog stdout/stderr handle-it érdemes explicit kezelni, különben esetleg egy terminálra (nohup.out file-ra, stb.) mutatnak:

cronolog ... >/dev/null 2>&1