Date: Wed, 5 Nov 1997 11:22:43 +0100 (CET) From: Martin Kammerhofer <dada@sbox.tu-graz.ac.at> To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: bin/4947: ps(1) output is not parsable and -Ortprio doesn't work Message-ID: <199711051022.LAA06379@lend.tu-graz.ac.at> Resent-Message-ID: <199711051030.CAA01234@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 4947 >Category: bin >Synopsis: ps(1) output is not parsable and -Ortprio doesn't work >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Nov 5 02:30:03 PST 1997 >Last-Modified: >Originator: Martin Kammerhofer >Organization: Graz University of Technology >Release: FreeBSD 2.2-STABLE i386 >Environment: nothing special >Description: I am parsing ps(1)'s output with perl. When I request *all* information ps(1) supplies (confer `ps -L`) on all processes (-ax) I run into trouble. Although care has been taken to print a default '-' or '?' for unknown/unset/empty fields this has been forgotten for 'LOGIN'. Processes 0,2,3 and 4 (they never call setlogin) just print a *blank* field - thereby confusing any perl/awk parser because the number of output fields is inconsistent. Another bug (yes, it's two bugs in one PR here) is that ps(1) cannot print a process's real time priority correctly. Currently with 'ps -Ortprio' you get the number (rtprio.prio << 16 + rtprio.type) which doesn't make much sense. The problem here is that a structure of two ushorts is printed as a long. (See /usr/include/sys/rtprio.h). Another bug (#3) remains: "ps -p0" doesn't work. This seems to be kvm_getprocs()'s fault and no fix is provided here. >How-To-Repeat: BUG #1: <ttyp5 /var/tmp>ps -axOlogin | head PID LOGIN TT STAT TIME COMMAND 0 ?? DLs 0:00.07 (swapper) 1 root ?? Ss 0:00.12 /sbin/init -- 2 ?? DL 0:02.50 (pagedaemon) 3 ?? DL 0:00.00 (vmdaemon) 4 ?? DL 0:26.16 (update) 43 root ?? Is 0:00.03 adjkerntz -i 91 root ?? Is 0:01.24 syslogd 97 root ?? Is 0:00.12 named -b /etc/namedb/named.boot 102 root ?? Is 0:00.01 portmap BUG #2: <ttyp5 /var/tmp>su # rtprio 10 sleep 100 & [1] 5143 # idprio 20 sleep 200 & [2] 5156 # ps -TOrtprio PID RTPRIO TT STAT TIME COMMAND 5090 1 p5 Is 0:00.50 -usr/local/bin/tcsh -i 5120 1 p5 S 0:00.46 -su (csh) 5143 655360 p5 I 0:00.05 sleep 100 5156 1310722 p5 S 0:00.04 sleep 200 5169 1 p5 R+ 0:00.03 ps -TOrtprio After applying my patch these look like: FIXED #1: <ttyp5 /var/tmp>ps -axOlogin | head PID LOGIN TT STAT TIME COMMAND 0 - ?? DLs 0:00.07 (swapper) 1 root ?? Is 0:00.12 /sbin/init -- 2 - ?? DL 0:02.50 (pagedaemon) 3 - ?? DL 0:00.00 (vmdaemon) 4 - ?? DL 0:26.62 (update) 43 root ?? Is 0:00.03 adjkerntz -i 91 root ?? Is 0:01.24 syslogd 97 root ?? Is 0:00.12 named -b /etc/namedb/named.boot 102 root ?? Is 0:00.01 portmap FIXED #2: <ttyp5 /var/tmp>su # rtprio 10 sleep 100 & [1] 5357 # idprio 20 sleep 200 & [2] 5361 # ps -TOrtprio PID RTPRIO TT STAT TIME COMMAND 5090 normal p5 Ss 0:00.55 -usr/local/bin/tcsh -i 5356 normal p5 S 0:00.41 -su (csh) 5357 real:10 p5 S 0:00.04 sleep 100 5361 idle:20 p5 S 0:00.04 sleep 200 5371 normal p5 R+ 0:00.06 ps -TOrtprio >Fix: apply this patch in /usr/src/bin/ps: Index: extern.h =================================================================== RCS file: /home/dada/cvsroot/bin/ps/extern.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -K -r1.1.1.1 -r1.2 --- extern.h 1996/10/21 07:30:23 1.1.1.1 +++ extern.h 1997/11/04 22:50:59 1.2 @@ -64,6 +64,7 @@ void pcpu __P((KINFO *, VARENT *)); void pmem __P((KINFO *, VARENT *)); void pri __P((KINFO *, VARENT *)); +void rtprior __P((KINFO *, VARENT *)); void printheader __P((void)); void pvar __P((KINFO *, VARENT *)); void rssize __P((KINFO *, VARENT *)); Index: keyword.c =================================================================== RCS file: /home/dada/cvsroot/bin/ps/keyword.c,v retrieving revision 1.1.1.1 retrieving revision 1.4 diff -u -K -r1.1.1.1 -r1.4 --- keyword.c 1996/07/31 09:27:23 1.1.1.1 +++ keyword.c 1997/11/05 10:03:00 1.4 @@ -139,7 +139,7 @@ {"rss", "RSS", NULL, 0, p_rssize, 4}, {"rssize", "", "rsz"}, {"rsz", "RSZ", NULL, 0, rssize, 4}, - {"rtprio", "RTPRIO", NULL, 0, pvar, 7, POFF(p_rtprio), LONG, "d"}, + {"rtprio", "RTPRIO", NULL, 0, rtprior, 7, POFF(p_rtprio)}, {"ruid", "RUID", NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_ruid), ULONG, UIDFMT}, {"ruser", "RUSER", NULL, LJUST, runame, USERLEN}, Index: print.c =================================================================== RCS file: /home/dada/cvsroot/bin/ps/print.c,v retrieving revision 1.1.1.1 retrieving revision 1.3 diff -u -K -r1.1.1.1 -r1.3 --- print.c 1997/04/16 16:10:48 1.1.1.1 +++ print.c 1997/11/05 08:59:33 1.3 @@ -164,12 +164,13 @@ VARENT *ve; { VAR *v; + char *s; v = ve->var; #ifndef NEWVM (void)printf("%-*s", v->width, KI_PROC(k)->p_logname); #else - (void)printf("%-*s", v->width, KI_EPROC(k)->e_login); + (void)printf("%-*s", v->width, (s = KI_EPROC(k)->e_login, *s) ? s : "-"); #endif } @@ -656,6 +657,38 @@ (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_xrssize)); } #endif + +void +rtprior(k, ve) + KINFO *k; + VARENT *ve; +{ + VAR *v; + struct rtprio *prtp; + char str[8]; + unsigned prio; + + v = ve->var; + prtp = (struct rtprio *) ((char *)KI_PROC(k) + v->off); + prio = prtp->prio; + if (prio > 99) + prio = 99; /* ensure that 'str' can *never* overflow */ + switch (prtp->type) { + case RTP_PRIO_REALTIME: + sprintf(str, "real:%u", prio); + break; + case RTP_PRIO_NORMAL: + strncpy(str, "normal", 7); + break; + case RTP_PRIO_IDLE: + sprintf(str, "idle:%u", prio); + break; + default: + strncpy(str, "?", 2); + break; + } + (void)printf("%*s", v->width, str); +} /* * Generic output routines. Print fields from various prototype >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199711051022.LAA06379>